1.如果在assignhandler 中取得当前的节点:
((ExecutionImpl) openExecution).getActivity()
2.动态创建连接。
String processDefinitionId = processInstance.getProcessDefinitionId();
ProcessDefinitionImpl processDefinition =(ProcessDefinitionImpl)processEngine
.getRepositoryService()
.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId)
.uniqueResult();
Execution execution = processInstance.findActiveExecutionIn(startActivity);
if (execution == null) {
System.out.println("在" + processDefinitionId + "中没有找到startActivity活动名称" + startActivity);
}
ExecutionImpl executionImpl = (ExecutionImpl) execution;
Activity activity = executionImpl.getActivity();
ActivityImpl activityFind = processDefinition.findActivity(endActivity);
//判断在流程中是否有这个结点
if (activityFind == null) {
System.out.println("在" + processDefinitionId + "中没有找endActivity活动名称" + endActivity);
}
TransitionImpl transition = activityFind.createOutgoingTransition();
String transitionName = startActivity + "-to-"+ endActivity;
transition.setName(transitionName);
transition.setDestination(activityFind);
((ActivityImpl)activity).addOutgoingTransition(transition);
//验证
Execution executionTemp = processInstance.findActiveExecutionIn(startActivity);
ExecutionImpl executionImplTemp = (ExecutionImpl) execution;
ActivityImpl activitytemp =(ActivityImpl)executionImpl.getActivity();
List<Transition> transitions = activitytemp.getOutgoingTransitions();
for(Transition transition1 : transitions){
System.out.println("transition name"+ transition1.getName());
}
}
3.整合spring后如和从AssignHandler获取bean
把jbpm4与spring整合之后。
可以在assignmenthandler中通过EnvironmentImpl.getFromCurrent()获得spring中定义的bean。
在jpdl.xml中,直接设置了class,因此assignmenthandler没有被spring托管,不被spring管理的bean是不会从spring获得依赖的
4.获取当前流程实例所处的节点名字
List<ProcessInstance> processInstanceList = executionService.createProcessInstanceQuery().list();
for(ProcessInstance pi : processInstanceList){
pi.findActiveActivityNames()
}
5.概念 processinstance和execution的区别
两者是存储在一张表里的,两个接口的具体实现类也是一样的,都是ExecutionImpl。
区别是,当流程中拥有多个分支并发execution时,处于最顶级的execution就叫做ProcessInstance。
如果流程中没有并发,只有一条主线,那么这个execution就是processInstance。
在使用fork分支之后,一个processInstance下就会出现多个execution,每个execution指向对应的分支。
如果没有分支,就只有一个process instance,它既是execution又是process instance。所谓的process isntance就是没有parent的特殊execution。
6.从事件中获取Session
Session session = EnvironmentImpl.getFromCurrent(Session.class);
7.查询已完成的任务
historyService中没有提供直接查询已完成任务的途径,需要自己通过hibernate查询HistoryTaskImpl,查询条件为endTime is not null。
8.获取开始的活动。
processDefinitionImpl.getInital()就是第一个start活动
9.execution和task的关系是,task.getExecutionId(),通过task的executionId可以查询到对应的execution.
10.默认情况下,流程会按照顺序执行,第一个任务结束后才会创建第二个任务
如果想并行同时发起任务,使用fork join
11.获取当前活动对应的活动节点,要先通过task的name去查询任务对应的activity,然后获得activity所有的outgoingTransition,然后获得每个outgoingTransition的destination,也就是连线后面的节点了。
12.获取 TaskImpl task = (TaskImpl) taskService.getTask(taskId);
13.获取join活动完成的活动的个数,获得processInstance,找到childExecutions,判断有几个状态不是inactive-join。
14.通过historyService查询HistoryProcessInstance,没有结束时间的,是未完成的。有结束时间的,是已完成的。
15.Task是Execution执行到TaskActivity创建出来的,task完成后,会触发对应的Execution继续执行。
16.任务分配后,可以使用taskService.assignTask()进行任务的重新分配。
17.在监听器中获取任务实例的方法。TaskImpl task = EnvironmentImpl.getFromCurrent(DbSession.class).findTaskByExecution(execution);
18.任务节点
* 任务创建
* 1.创建任务
* 设置任务参数。
* 2.设置人员
* 设置执行人
* 设置候选人
* 设置候选组
* 处理AssignHandler
* 3.创建历史任务。