jBPM是由JBoss开发的工作流和业务流程管理引擎,可以用于创建不同人、不同应用程序、不同服务之间交互的业务流程。jBPM还提供了一个可视化的业务流程设计器。jBPM包含下列组件:运行时引擎(一个POJO库),图形化设计器(一个Eclipse插件),基于Hibernate的持久化,基于JSF的web控制台,BPEL扩展等。
Hello World示例
流程定义是一个可管理的包含了节点和节点间交付件的流程图。Hello World示例流程包含三个节点。为了查看节点间如何相互配合,将不使用任何设计工具来定义一个简单的流程。下图显示了Hello World示例流程的流程图定义:
Hello World示例流程图
public void testHelloWorldProcess() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" +<br>" <start-state>" +<br>" <transition to="s"></transition>" +<br>" </start-state>" +<br>" <state name="s">" +<br>" <transition to="end"></transition>" +<br>" </state>" +<br>" <end-state name="end"></end-state>" +<br>"</process-definition>" ); ProcessInstance processInstance = new ProcessInstance(processDefinition); Token token = processInstance.getRootToken(); assertSame(processDefinition.getStartState(), token.getNode()); token.signal(); assertSame(processDefinition.getNode("s"), token.getNode()); token.signal(); assertSame(processDefinition.getNode("end"), token.getNode()); } |
数据库示例
jBPM基本特性之一是能够在jBPM数据库中持久化执行过程中处于等待状态的流程。数据库示例将展示如何在jBPM数据库中存储一个流程实例。该示例可能涉及到jBPM上下文。为不同的用户代码创建Separate方法。举例来说,webapplication中的一段用户代码开始一个流程并在数据库中持久化。之后,一个消息驱动Bean(MDB)加载该流程实例继续执行流程。
public class HelloWorldDbTest extends TestCase { static JbpmConfiguration jbpmConfiguration = null; static { jbpmConfiguration = JbpmConfiguration.parseXmlString( "<jbpm-configuration>" +<br> " <jbpm-context>" +<br> " <service name="persistence"></service> " factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />" + <br> " </jbpm-context>" +<br> " <string name="resource.hibernate.cfg.xml"></string> " value='hibernate.cfg.xml' />" +<br> " <string name="resource.business.calendar"></string> " value='org/jbpm/calendar/jbpm.business.calendar.properties' />" +<br> " <string name="resource.default.modules"></string> " value='org/jbpm/graph/def/jbpm.default.modules.properties' />" +<br> " <string name="resource.converter"></string> " value='org/jbpm/db/hibernate/jbpm.converter.properties' />" +<br> " <string name="resource.action.types"></string> " value='org/jbpm/graph/action/action.types.xml' />" +<br> " <string name="resource.node.types"></string> " value='org/jbpm/graph/node/node.types.xml' />" +<br> " <string name="resource.varmapping"></string> " value='org/jbpm/context/exe/jbpm.varmapping.xml' />" +<br> "</jbpm-configuration>" ); } public void setUp() { jbpmConfiguration.createSchema(); } public void tearDown() { jbpmConfiguration.dropSchema(); } public void testSimplePersistence() { deployProcessDefinition(); processInstanceIsCreatedWhenUserSubmitsWebappForm(); theProcessInstanceContinuesWhenAnAsyncMessageIsReceived(); } public void deployProcessDefinition() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition name="hello world">" +<br> " <start-state name="start">" +<br> " <transition to="s"></transition>" +<br> " </start-state>" +<br> " <state name="s">" +<br> " <transition to="end"></transition>" +<br> " </state>" +<br> " <end-state name="end"></end-state>" +<br> "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { jbpmContext.deployProcessDefinition(processDefinition); } finally { jbpmContext.close(); } } public void processInstanceIsCreatedWhenUserSubmitsWebappForm() { JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { GraphSession graphSession = jbpmContext.getGraphSession(); ProcessDefinition processDefinition =graphSession.findLatestProcessDefinition("hello world"); ProcessInstance processInstance = new ProcessInstance(processDefinition); Token token = processInstance.getRootToken(); assertEquals("start", token.getNode().getName()); token.signal(); assertEquals("s", token.getNode().getName()); jbpmContext.save(processInstance); } finally { jbpmContext.close(); } } public void theProcessInstanceContinuesWhenAnAsyncMessageIsReceived() { JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { GraphSession graphSession = jbpmContext.getGraphSession(); ProcessDefinition processDefinition =graphSession.findLatestProcessDefinition("hello world"); List processInstances =graphSession.findProcessInstances(processDefinition.getId()); ProcessInstance processInstance =(ProcessInstance) processInstances.get(0); processInstance.signal(); assertTrue(processInstance.hasEnded()); jbpmContext.save(processInstance); } finally { jbpmContext.close(); } } }
|
上下文示例:流程变量
流程变量包含了流程执行期间的上下文信息。流程变量类似一个java.util.Map类型的名称/值对,并且是java对象。流程变量是流程实例的组成部分。以免事件复杂化,该示例仅仅演示处理流程变量的API,没有包括持久化处理。
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" +<br> " <start-state>" +<br> " <transition to="s"></transition>" +<br> " </start-state>" +<br> " <state name="s">" +<br> " <transition to="end"></transition>" +<br> " </state>" +<br> " <end-state name="end"></end-state>" +<br> "</process-definition>" ); ProcessInstance processInstance = new ProcessInstance(processDefinition); ContextInstance contextInstance = processInstance.getContextInstance(); contextInstance.setVariable("amount", new Integer(500)); contextInstance.setVariable("reason", "i met my deadline"); processInstance.signal(); assertEquals(new Integer(500), contextInstance.getVariable("amount")); assertEquals("i met my deadline", contextInstance.getVariable("reason")); |
任务分配示例
任务分配示例演示如何给用户分配任务。因为分离jBPM工作流引擎和组织模型,处理参与者的表现语言始终受到很多限制。因此,你必须实现一个包含处理任务参与者的任务分配器。
public void testTaskAssignment() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition name="the baby process">" +<br> " <start-state>" +<br> " <transition name="baby cries" to="t"></transition>" +<br> " </start-state>" +<br> " <task-node name="t">" +<br> " <task name="change nappy">" +<br> " <assignment class="org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler"></assignment>" +<br> " </task>" +<br> " <transition to="end"></transition>" +<br> " </task-node>" +<br> " <end-state name="end"></end-state>" +<br> "</process-definition>" ); ProcessInstance processInstance = new ProcessInstance(processDefinition); Token token = processInstance.getRootToken(); token.signal(); assertSame(processDefinition.getNode("t"), token.getNode()); TaskInstance taskInstance = (TaskInstance)processInstance .getTaskMgmtInstance() .getTaskInstances() .iterator().next(); assertEquals("papa", taskInstance.getActorId() ); taskInstance.end(); assertSame(processDefinition.getNode("end"), token.getNode()); } |
JBoss jBPM 3.1 Workflow and BPM made practical
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
分享到:
相关推荐
jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版jboss jbpm 5.0 最新版
JBoss jBPM 是一个复杂的可扩展的工作流管理系统. JBoss jBPM 有直观的流程语言来表示商业流程图的术语比如,任务,异步通讯的等待状态,定时器,自动操作等等.把这些操作绑在一起,, JBoss jBPM 就有了最强大和易扩展性...
从j2ee应用服务器,到o/rmapping工具,到这个工作流引擎等等。为什么Shark的持久层采用DODS来实现?就是因为他们是一家人。 Jbpm的靠山是jboss。Jbpm3的持久层采用hibernate3来实现,也是因为这个原因吧。Jbpm3的...
NULL 博文链接:https://hongyegu.iteye.com/blog/765007
jboss jbpm下的业务流程管理实例(内有文档非常)jboss jbpm下的业务流程管理实例(内有文档非常)
JBoss+jBPM+jPDL用户开发手册,JBPM数据库表说明,工作流框架jbpm使用说明书
Spring与JBoss JBPM工作流集成开发指南
JBoss jBPM 是一个复杂的可扩展的工作流管理系统. JBoss jBPM 有直观的流程语言来表示商业流程图的术语比如,任务,异步通讯的等待状态,定时器,自动操作等等.把这些操作绑在一起,, JBoss jBPM 就有了最强大和易扩展性...
工作流引擎技术的改进及其应用,在实现开源的工作流引擎的过程中是比较实用的文章。
Business Process Management with JBoss jBPM.pdf Business Process Management with JBoss jBPM.pdf
基于JBOSS_jBPM工作流技术的改进和应用基于JBOSS_jBPM工作流技术的改进和应用
JBoss jBPM 实例说明 struts1.1+spring1.2+hibernate3.0+jbpm3.1.4可以tomcat下运行,可通过图形模式发布工程,配置了在网页显示jbpm流程图的标签文件。
JBOSS jBPM4.3源码(jBPM是公开源代码项目,它使用要遵循 Apache License。)
Business Process Management with JBoss jBPM
使用JBoss jBPM实现流程访问和执行的授权
JBoss jBPM 是一个复杂的可扩展的工作流管理系统. JBoss jBPM 有直观的流程语言来表示商业流程图的术语比如,任务,异步通讯的等待状态,定时器,自动操作等等.把这些操作绑在一起,, JBoss jBPM 就有了最强大和易扩展性...
JBoss jBPM 是一个灵活的,易扩展的工作流管理系统。JBoss jBPM有一套直观的流程建模语言,这套语言能用任务(task),异步通信的等待状态(wait state ),定时器(timer),自动化的动作(automated action)等来...
JBPM3.2.2源码,工作流引擎。JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。jBPM是公开源...