jbpm学习笔记(五) jbpm不同服务的详细介绍以及使用 走完流程整个生命周期
上一篇的示例中我们尝试用了jbpm Service API,现在我们仍然详细介绍API。
一,流程引擎对象,ProcessEngine是jbpm4所有Service API之源
在jbpm中各种服务相互依存,但所有的service API都从ProcessEngine中获得,它是由
Configuration类构建的,即工作流引擎根据配置产生。
ProcessEngine是线程安全的,因此它可以保存在静态变量中,甚至JNDI命名服务
中或者其他重要位置。在应用中,所有线程和请求都可以使用同一个ProcessEngine对象,
以下代码告诉您如何获得ProcessEngine:
ProcessEngine processEngine=Configuration.getProcessEngine();
ProcessEngine processEngine=new Configuration().setResource(“myjbpm.xml”).buildProcessEngine();
ProcessInstance processInstance=executionService.startProcessInstanceByKey(“order”);
ProcessInstance processInstance=executionService.startProcessInstanceByKey(“order”,”afei520”);
Map<String, Object> valMap = new HashMap<String, Object>();valMap.put("proposer", user);//创建流程实例return executionService.startProcessInstanceByKey("loan",valMap);List<Task> tasks=taskService.findPersonalTasks(“afei”);
String taskId=taskId; Set<String> varis=taskService.getVariableNames()taskId; //读取任务变量 Set<String> variableNames=taskService.getVariableNames(checkTask.getId());for(Iterator<String> it=variableNames.iterator();it.hasNext();){System.out.println("task vari:"+it.next());}Map<String,Object> variables=taskService.getVariables(checkTask.getId(),variableNames);System.out.println("variables:"+variables);或自行创建variables=new HashMap<String,Object>();//设置”键值”形式的任务变量Variables.put(“username”,”afei”);Variables.put(“age”,111111);//将变量存入任务taskService.setVariables(taskId,variables);List<ProcessInstance> results=executionService. createProcessInstanceQuery(). processDefinitionId(“my_process_definition”).//流程定义IdnotSuspended().//未挂起Page(0,50).list();//分页
List<Task> tasks=taskService.createTaskQuery(). processInstanceId(piId).//流程实例 assignee(“Alex”).分配给Alex的任务 page(100,200).//分页 orderDesc(TaskQuery.PROPERTY_DUEDATE).//根据日期逆向排序 List();
<?xml version="1.0" encoding="UTF-8"?><process name="angel" xmlns="http://jbpm.org/4.4/jpdl"> <start name="start"> <transition name="to state" to="state"/> </start> <!-- state活动是等待活动。需要收到一个外部的执行信号才能流转通过。 --> <state name="state"> <transition name="to task" to="task"/> </state> <!-- task活动是等待活动。在这里被分配给用户afei办理,afei办理完成提交任务后才能流转通过 --> <task assignee="afei" name="task"> <transition name="to end" to="end"/> </task> <end name="end"/> </process>
package org.test;import org.jbpm.api.Execution;import org.jbpm.api.ProcessInstance;import org.jbpm.api.history.HistoryProcessInstance;import org.jbpm.api.history.HistoryTask;import org.jbpm.api.task.Task;import org.jbpm.test.JbpmTestCase;public class AngelTest extends JbpmTestCase {String deploymentId;@Overridepublic void setUp() throws Exception {super.setUp();deploymentId = repositoryService.createDeployment().addResourceFromClasspath("org/test/angel.jpdl.xml").deploy();}@Overridepublic void tearDown() throws Exception {repositoryService.deleteDeploymentCascade(deploymentId);super.tearDown();}public void testAfei() {System.out.println("********testAfei start********");// 使用执行服务:根据已部署流程定义的名称angel,发起流程实例ProcessInstance pi = executionService.startProcessInstanceByKey("angel");// 获取流程实例IDString pid = pi.getId();// 获取当前活动的执行对象Execution executionState = pi.findActiveExecutionIn("state");// 断言当前活动即为stateassertNotNull(executionState);// 使用执行服务:发出执行信号结束当前活动,继续流程的执行executionService.signalExecutionById(executionState.getId());// 使用执行服务:从持久化层中获取“最新”的流程实例对象pi = executionService.findProcessInstanceById(pid);Execution executionTask = pi.findActiveExecutionIn("task");// 断言当前活动即为taskassertNotNull(executionTask);// 使用任务服务:获取用户afei的任务,即task活动产生的任务Task task = taskService.findPersonalTasks("afei").get(0);// 使用任务服务:完成任务taskService.completeTask(task.getId());// 使用历史服务:创建历史任务查询HistoryTask historyTask = historyService.createHistoryTaskQuery().taskId(task.getId()).uniqueResult();// 断言上一步完成的任务已成为历史,即可通过历史任务查询获取之assertNotNull(historyTask);// 断言该流程实例已经结束assertProcessInstanceEnded(pid);// 使用历史服务:创建历史流程实例查询HistoryProcessInstance hpi = historyService.createHistoryProcessInstanceQuery().processInstanceId(pid).uniqueResult();//断言该流程实例已经成为历史,即可通过历史流程实例查询获取它assertNotNull(hpi);//单元测试至此执行完毕System.out.println("********testAfei end********");}}这个例子主要是进一步看看Service API的功能及其使用场景。这个例子基本上走完了一个流程的完整生命周期,下一篇着重介绍Jbpm的核心————jPDL。