(1)定义如下工作流程:
<?xml version="1.0" encoding="UTF-8"?> <process name="event" xmlns="http://jbpm.org/4.3/jpdl"> <on event="start"> <event-listener class="com.family168.ProcessEventListener"/> </on> <on event="end"> <event-listener class="com.family168.ProcessEventListener"/> </on> <start g="156,56,48,48" name="start1"> <on event="start"> <event-listener class="com.family168.ProcessEventListener"/> </on> <on event="end"> <event-listener class="com.family168.ProcessEventListener"/> </on> <transition g="-49,-18" name="to state1" to="state1"/> </start> <state g="133,160,92,52" name="state1"> <on event="start"> <event-listener class="com.family168.ProcessEventListener"/> </on> <on event="end"> <event-listener class="com.family168.ProcessEventListener"/> </on> <transition g="-42,-18" name="to end1" to="end1"/> </state> <end g="155,275,48,48" name="end1"> <on event="start"> <event-listener class="com.family168.ProcessEventListener"/> </on> <on event="end"> <event-listener class="com.family168.ProcessEventListener"/> </on> </end> </process>
即简单的流程:start ---> state1 ---> end
(2)流程测试:
package com.family168; import junit.framework.TestCase; import org.jbpm.api.*; import java.util.*; public class HelloTest extends TestCase { ProcessEngine processEngine; public HelloTest() { processEngine = Configuration.getProcessEngine(); } public void testDeploy() { //定义repositoryService主要是对为了查看流程管理流程用的 RepositoryService repositoryService = processEngine .getRepositoryService(); String deploymentId = repositoryService.createDeployment() .addResourceFromClasspath("helloworld.jpdl.xml").deploy();//将流程定义(就是工作的流程写成的XML文件)发布到流程引擎中去 //下面是获取所有已发布的流程定义 List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list(); for (ProcessDefinition pd : list) { System.out.println(pd.getId());//打印流程定义的ID } //删除不需要的流程定义,即将发布到工作引擎中的流程定义删除掉 repositoryService.deleteDeploymentCascade(deploymentId);//使用Cascade表示级联删除 System.out.println(repositoryService.createProcessDefinitionQuery().list().size()); } }
package com.family168; import junit.framework.TestCase; import org.jbpm.api.*; import java.util.*; public class ProcessInstanceTest extends TestCase { //要先启用工作流引擎,所有操作都是从processEngine开始的。 ProcessEngine processEngine; public ProcessInstanceTest() { //下面的默认方式会到类路径下去找jbpm.cfg.xml加载这个配置文件信息,再生成工作引擎 processEngine = Configuration.getProcessEngine();//这样就可以获取到流程引擎 } protected void setUp() { //在操作之前我们得先发布一个流程定义,这样才能发起流程的操作 processEngine.getRepositoryService().createDeployment() .addResourceFromClasspath("helloworld.jpdl.xml").deploy();//jpdl流程文件都是以.jpdl.xml作为扩展名的 } //下面是测试流程实例 public void testProcessInstance() { //首先是获取一个ExecutionService的实例,这是用来控制流程实例的。 ExecutionService executionService = processEngine.getExecutionService(); //启动一个新的流程实例 ProcessInstance pi = executionService.startProcessInstanceByKey("helloworld");//一发布一个流程,那么系统会分配一个id给这个流,具体的过程见jBPM4.1使用指南23页讲得很清楚 // System.out.println(pi);//运行后会返回:execution[helloworld.7]它是发布的流程的一个实例 /* * pi就是流程实例了,那么它开启后,就会往下执行,这里设置打印它的运行状态,看这个实例结束了没有,这里的结果为false,可以看出实例并没有结束 * 实例没有结束的原因:我们发布的helloworld.jpdl.xml文件就设置了是从start1---->task------>end1的流程,所以在开启流程实例后,它会运行到task * 后会处于等待状态,工作流主要就是要等待人来审判嘛,所以到一个结点后就停下来,处理后才能往下执行。 */ System.out.println(pi.isEnded()); //为了让等待状态的实例继续进行下去,这里可以 用signal来将等待中的实例唤醒,然后进入下一个工作结点,这里下从task到下一个工作结点就到end1了,就结束了,所以下面的打印实例ended的情况是true pi = executionService.signalExecutionById(pi.getId()); System.out.println(pi.isEnded()); } //下面是将一个工作实例取消掉,即到中途就让它结束,有两种方式,一是下面的取消方式,一是再下面的删除方式。 public void testProcessInstanceEnd() { ExecutionService executionService = processEngine.getExecutionService(); ProcessInstance pi = executionService.startProcessInstanceByKey("helloworld"); executionService.endProcessInstance(pi.getId(), "cancel");//发送取消命令,会取消掉在等待中的队列 } public void testProcessInstanceDelete() { ExecutionService executionService = processEngine.getExecutionService(); ProcessInstance pi = executionService.startProcessInstanceByKey("helloworld"); executionService.deleteProcessInstanceCascade(pi.getId());//直接将流程实例删除掉 } //下面方法是获取所有的流程实例,用executionService.createProcessInstanceQuery().list()方法可以获取到所有开启的流程实例的信息 public void testProcessInstanceList() { ExecutionService executionService = processEngine.getExecutionService(); ProcessInstance pi = executionService.startProcessInstanceByKey("helloworld"); ProcessInstance pi2 = executionService.startProcessInstanceByKey("helloworld"); List<ProcessInstance> list = executionService.createProcessInstanceQuery().list(); for (ProcessInstance processInstance : list) { System.out.println(processInstance.getId());//可以查看自动生成的流程实例ID } } }
(3)定义task的流程定义(task.jpdl.xml),还是简单的流程:start ---> state1 ---> end,只是加入了工作组,在下面的测试中会用到组任务的分派及处理:
<?xml version="1.0" encoding="UTF-8"?> <process name="task" xmlns="http://jbpm.org/4.3/jpdl"> <start g="153,82,48,48" name="start1"> <transition g="-44,-18" name="to task1" to="task1"/> </start> <end g="155,315,48,48" name="end1"/> <task candidate-groups="dev" g="131,188,92,52" name="task1"> <transition g="-42,-18" name="to end1" to="end1"/> </task> </process>
package com.family168; import junit.framework.TestCase; import org.jbpm.api.*; import org.jbpm.api.task.*; import java.util.*; //task.jdpl.xml这个流程定义是想将一个组的任务给出来,用户可以进行竞争获取任务等的例子 public class TaskTest extends TestCase { ProcessEngine processEngine; public TaskTest() { processEngine = Configuration.getProcessEngine(); //下面用了identity是身份验证,实际上它起来的就是组织机构的作用 IdentityService identityService = processEngine.getIdentityService(); identityService.createGroup("dev");//这里创建一个组 //下面两行是添加用户 identityService.createUser("user1", "user1", "user1"); identityService.createUser("user2", "user2", "user3"); //下面两行是将用户添加入组里去 identityService.createMembership("user1", "dev"); identityService.createMembership("user2", "dev"); } public void testTask() { RepositoryService repositoryService = processEngine .getRepositoryService(); TaskService taskService = processEngine.getTaskService(); ExecutionService executionService = processEngine.getExecutionService(); String deploymentId = repositoryService.createDeployment() .addResourceFromClasspath("task.jpdl.xml").deploy(); //启动一个流程实例 ProcessInstance processInstance = executionService .startProcessInstanceByKey("task"); //用taskService.findGroupTasks()方法可以获得用户所在组的任务 assertEquals(1, taskService.findGroupTasks("user1").size()); assertEquals(1, taskService.findGroupTasks("user2").size()); //获取用户所有所在组的任务 List<Task> groupTaskList = taskService.findGroupTasks("user1"); Task task = groupTaskList.get(0);//将第一个任务取出来 taskService.takeTask(task.getId(), "user1");//user1接收第一个task任务 taskService.completeTask(task.getId());//完成任务 } }
(4)定义事件流程定义,还是简单的流程:start ---> state1 ---> end,只是增加了事件的标记,可以在事件产生后,触发相应操作:
<?xml version="1.0" encoding="UTF-8"?> <process name="event" xmlns="http://jbpm.org/4.3/jpdl"> <on event="start"> <event-listener class="com.family168.ProcessEventListener"/> </on> <on event="end"> <event-listener class="com.family168.ProcessEventListener"/> </on> <start g="156,56,48,48" name="start1"> <on event="start"> <event-listener class="com.family168.ProcessEventListener"/> </on> <on event="end"> <event-listener class="com.family168.ProcessEventListener"/> </on> <transition g="-49,-18" name="to state1" to="state1"/> </start> <state g="133,160,92,52" name="state1"> <on event="start"> <event-listener class="com.family168.ProcessEventListener"/> </on> <on event="end"> <event-listener class="com.family168.ProcessEventListener"/> </on> <transition g="-42,-18" name="to end1" to="end1"/> </state> <end g="155,275,48,48" name="end1"> <on event="start"> <event-listener class="com.family168.ProcessEventListener"/> </on> <on event="end"> <event-listener class="com.family168.ProcessEventListener"/> </on> </end> </process>
package com.family168; import junit.framework.TestCase; import org.jbpm.api.*; public class EventTest extends TestCase { ProcessEngine processEngine; public EventTest() { processEngine = Configuration.getProcessEngine(); } /* * 我们可以分析出按even.jpdl.xml的配置文件所配的事件监听,因为有流程事件监听,那么开始启动流程实例就会触发流程启动事件 * 流程实例开始后会从start1开始,由于start1没有入度,即没有不会触发活动start1的start事件,但会行下执行,会触发它的end事件 * 流程实例会运行到state1并停在那里,所以会触发state1的start事件,但没有触发它的end事件 * 因此,共会触发三次事件,打印的结果也是这样 * */ public void testDeploy() { RepositoryService repositoryService = processEngine.getRepositoryService(); String deploymentId = repositoryService.createDeployment().addResourceFromClasspath("event.jpdl.xml").deploy(); ExecutionService executionService = processEngine.getExecutionService(); executionService.startProcessInstanceByKey("event"); } }