JBPM笔记二
一、流程变量
1、连接线及信息号发送
<transition g="-83,-32" name="to state1" to="state1"/>
连接--
name--名称,如果一个连接没有name属性,则该线为默认的下一步。
to--连接到活动(节点)名称
当发送信息时,可以指定信号名称name,则将会把往指定名称的流向跳转。
executionService.signalExecutionById(pi.getId(),"to state2");
<state g="238,67,92,52" name="state1">
<transition g="-49,-18" name="to state2" to="state2"/>
<transition to="state4"/>
</state>
2、流程变量
绑定到流程实例上的数据内容。
支持各种基本的类型,serializable的类型。
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
如果流程变量中存的是一个持久化对象,要求对象不能是transient状态。必须有一个id。还要防止session关闭的问题。要用到OpenSessionInView模式,并确保业务层的Session与jbPM的Session是同一个。
解决方案:是流程变量中存持久化对象的id就可以。
3、设置流程变量
A、初始的时候创建流程变量
//创建流程变量
Map<String,Object> vars=new HashMap<String,Object>();
vars.put("user", "abc");
vars.put("date", new Date());
//起动带变量的流程实例
executionService.startProcessInstanceByKey(pdkey,vars);
B、在流程实例运转的过程增加修改流程变量
设置某一个变量
executionService.setVariable(pi.getId(), "test", "11111:"+pi.findActiveActivityNames().iterator().next());
//批量设置变量的值
executionService.setVariables(pi.getId(), vars);
4、如何读取流程变量
//读取某一个流程变量的值
Object u= executionService.getVariable(pi.getId(), "user");
///获得所有变量的名称
Set<String> names=executionService.getVariableNames(pi.getId());
System.out.println("变量名:"+names);
//获得所有流程变量的键值对
Map<String,Object> vars=executionService.getVariables(pi.getId(), names);
System.out.println("user:"+u);
二、任务Task简介
1、任务节点
<task name="借款申请" g="244,135,92,52" assignee="employee">
<transition name="to 经理审批" to="经理审批" g="-66,-18"/>
</task>
2、查找某一个人的待办任务
//获得某一个人要输的任务
List<Task> list= taskService.findPersonalTasks("employee");
System.out.println("任务数:"+list.size());
for(Task t:list){
System.out.println(t);
System.out.println(t.getAssignee()+":"+t.getCreateTime()+":"+t.getDuedate());
}
3、办理一个任务
//1,办理这个任务,流到默认的下一步环节.
taskService.completeTask(taskId);*/
//2,办完一个任务,并指定下一步的流转方向
taskService.completeTask(taskId,"to end1");
/*//3,办任务,并且指定任务变量,会存到流程实例变量中
Map<String,Object> vars=new HashMap<String,Object>();
vars.put("msg", "借5000块钱回家过年");
taskService.completeTask(taskId, "to 经理审批",vars);*/
4、查询所有任务
//查询正办理中的任务
TaskService taskService= JbpmUtil.getEngine().getTaskService();
List<Task> list= taskService.createTaskQuery().list();
//查询所有历史任务
HistoryService historyService= JbpmUtil.getEngine().getHistoryService();
List<HistoryTask> historyList= historyService.createHistoryTaskQuery().list();
三、基于jbpm的办公任务简单实例
四、JBPM API综合及源码查看
1、核心Service的API
A、RepositoryService
NewDeployment createDeployment();
void suspendDeployment(String deploymentId);--暂停
void resumeDeployment(String deploymentId);--重新起用
void deleteDeployment(String deploymentId);--删除
void deleteDeploymentCascade(String deploymentId);--级联删除流程部署及他所有流程实例,任务日志信息
Set<String> getResourceNames(String deploymentId);--获得部署中所有资源文件名称(jpdl.xml,png)
InputStream getResourceAsStream(String deploymentId, String resourceName);--获得承部署文件中某一个文件的内容。
ProcessDefinitionQuery createProcessDefinitionQuery();---查询流程定义信息
List<String> getStartActivityNames(String processDefinitionId);
String getStartFormResourceName(String processDefinitionId, String activityName);---在节点写form元素,得到流程定义中某一个活动的表单名称。
ActivityCoordinates getActivityCoordinates(String processDefinitionId, String activityName);--获得流程中某一个活动的图形座标值
Deployment ProcessDefinition
B、ExecutionService
流程实例--->流程执行(Excution)(正在执行一个流程)
启动流程实例
ProcessInstance startProcessInstanceById(String processDefinitionId);
ProcessInstance startProcessInstanceByKey(String processDefinitionKey);
ProcessInstance startProcessInstanceByKey(String processDefinitionKey, String processInstanceKey);
ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, ?> variables);
...
查询流程实例及执行中流程
ProcessInstance findProcessInstanceById(String processInstanceId);
Execution findExecutionById(String executionId);
ProcessInstanceQuery createProcessInstanceQuery();
//推进流程的api
ProcessInstance signalExecutionById(String executionId);
ProcessInstance signalExecutionById(String executionId, String signalName);
ProcessInstance signalExecutionById(String executionId, String signalName, Map<String, ?> parameters);
设置流程实例的变量
void setVariable(String executionId, String name, Object value);
void setVariables(String executionId, Map<String, ?> variables);
...
查看流程实例变量
Object getVariable(String executionId, String variableName);
Set<String> getVariableNames(String executionId);
Map<String, Object> getVariables(String executionId, Set<String> variableNames);
强制终止流程实例
void endProcessInstance(String processInstanceId, String state);
void deleteProcessInstance(String processInstanceId);
void deleteProcessInstanceCascade(String processInstanceId);
C、TaskService--任务管理,任务的查询,任务指派,任务添删改,任务变量设置等,任务完成。
D、HistoryService--用来查询jBPm中各种流程及流程流转过程产生的对象信息。
HistoryProcessInstanceQuery createHistoryProcessInstanceQuery();
HistoryActivityInstanceQuery createHistoryActivityInstanceQuery();
HistoryTaskQuery createHistoryTaskQuery();
HistoryDetailQuery createHistoryDetailQuery();
Map<String, Number> avgDurationPerActivity(String processDefinitionId);---查询流程活动的平均持续时间
Map<String, Number> choiceDistribution(String processDefinitionId, String activityName);--查询流程定义中某一个分支的选择的次数。
Set<String> getVariableNames(String processInstanceId);--所有变量名
Object getVariable(String processInstanceId, String variableName);
Map<String, ?> getVariables(String processInstanceId, Set<String> variableNames);
E、ManagementService管理工作任务JOB等
void executeJob(String jobId);
JobQuery createJobQuery();
boolean deleteJob(long jobId);
F、IdentityService---用户及用户组管理的服务组件。
2、核心的领域模型(实体类,PO,值类VO //数据传输对象DTO)
Deployment--流程部署信息
NewDeployment---新发部流程定义信息
ProcessDefinition--根据流程部署中流程文件信息解析出来流程定义对象。
Execution--执行的流程
ProcessInstance--流程实例
Execution findActiveExecutionIn(String activityName);--在某一个活动上是否有正在执行的流程。
Set<String> findActiveActivityNames();
Task--任务信息
Activity--活动
Transition--连接线
五、jBPM中的流程节点
1、state节点--等.发信号
2、decision节点--决策活动
A、通过condition节点来指定跳转
<decision g="254,214,48,48" name="exclusive1">
<transition g="-49,-18" name="to state2" to="state2">
<condition expr="#{age gt 10}"/>
</transition>
<transition g="-49,-18" name="to state3" to="state3">
<condition expr="#{age lt 10}"/>
</transition>
</decision>
//设置流程实例变量
exeService.setVariable(pi.getId(), "age", 8);
exeService.signalExecutionById(pi.getId());
B、通过expr表达式来指定跳转
<decision expr="#{next}" g="254,214,48,48" name="exclusive1">
<transition g="-49,-18" name="to state2" to="state2">
</transition>
<transition g="8,-13" name="to state3" to="state3">
</transition>
</decision>
exeService.setVariable(pi.getId(), "next", "to state3");
exeService.signalExecutionById(pi.getId());
C、设置Hanlder来进行决策
<decision g="254,214,48,48" name="exclusive1">
<handler class="cn.itcast.gz.jbpm.MyDecisionHandler" >
<property name="max"><int value="5"></int></property>
</handler>
<transition g="-49,-18" name="to state2" to="state2">
</transition>
<transition g="8,-13" name="to state3" to="state3">
</transition>
</decision>
public class MyDecisionHandler implements DecisionHandler {
private Integer max=20;
public void setMax(Integer max) {
this.max = max;
}
@Override
public String decide(OpenExecution execution) {
System.out.println("执行流转判断");
Map<String,?> vars= execution.getVariables();
Integer age=(Integer)vars.get("age");
return age>max?"to state2":"to state3";
}
}
C、会签,并行走-fork-join
fork节点执行时,分走分支Execution,并且主流程实例不可用;只有当每一个分支走完后,才回到主流程实例。
<state g="361,238,92,52" name="state4">
<transition name="to join1" to="join1" g="-41,-18"/>
</state>
<fork name="fork1" g="217,184,48,48">
<transition name="to state2" to="state2" g="-49,-18"/>
<transition name="to state4" to="state4" g="-49,-18"/>
</fork>
<join name="join1" g="504,197,48,48">
<transition name="to state5" to="state5" g="-49,-18"/>
</join>
六、任务详情
1、指定任务候选人
<task name="task1" g="228,129,92,52" candidate-users="test,abc,itcast">
<transition name="to task2" to="task2" g="-44,-18"/>
</task>
2、任务的领取
先查询某一个用户可以领取的任务(findGroupTasks(name);),然后再调用takeTask()方法来领取任务。
//返回可以由某一个用户来处理的任务,findGroupTasks
//根据用户所在的组来查询
List<Task> tasks=taskService.findGroupTasks(name);
System.out.println(tasks);
//领取任务
if(tasks.size()>0){
System.out.println("领取任务....");
taskService.takeTask(tasks.get(0).getId(), name);
}
3、使用候选用户组来设置任务领取人
<task name="task1" g="228,129,92,52" candidate-groups="employee" >
<transition name="to task2" to="task2" g="-44,-18"/>
</task>
public void createUserAndGroup(){
IdentityService userService= JbpmUtil.getEngine().getIdentityService();
//创建用户
userService.createUser("itcast","传智","播客");
//创建组
userService.createGroup("employee");
userService.createMembership("itcast", "employee");
}
领任务
TaskService taskService= JbpmUtil.getEngine().getTaskService();
String name="itcast";
//返回可以由某一个用户来处理的任务,findGroupTasks
//根据用户所在的组来查询
List<Task> tasks=taskService.findGroupTasks(name);
System.out.println(tasks);
4、使用表达式从流程实例变量中来指定承办人
<task name="task1" g="228,129,92,52" assignee="#{o.name}" >
<transition name="to task2" to="task2" g="-44,-18"/>
</task>
Emp emp=new Emp();
emp.setName("abc");
vars.put("o", emp);
//起动带变量的流程实例
executionService.startProcessInstanceByKey(pdkey,vars);