JBPM FAQ

1.如果在assignhandler 中取得当前的节点:

((ExecutionImpl) openExecution).getActivity()
2.动态创建连接。

public void createNewTransition(ProcessInstance processInstance ,String startActivity , String endActivity){
        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.创建历史任务。




 


原文地址:https://www.cnblogs.com/yg_zhang/p/1982481.html