JBPM4.4:流程定义语言和活动、事件

1.     jBPM4.4的流程定义语言(设计流程)

1.1. process(流程)

是.jpdl.xml的根元素,可以指定的属性有:

属性名

作用说明

name

流程定义的名称,用于显示。

key

流程定义的key,用于查询。

如未指定,则默认为name的值。

version

版本,如果指定,则不能与已有的流程定义的版本重复;如未指定,则此key的流程定义的第1个为版本1,以后的是版本递增(每次加1)

 

 

 

1.2. Transition(连线、转移、流转)

1, 一个活动中可以指定0个或多个Transition。

a)        Start活动中只能有一个Transition。

b)       End活动中没有Transition。

c)        其他活动中有1条或多条Transition

2, 如果只有一个,则可以不指定名称(名称是null);如果有多个,则要分别指定唯一的名称。

 

publicclass ProcessTest {

 

    privatestatic ProcessEngine processEngine = Configuration.getProcessEngine();

 

    @Test

    publicvoid testProcess() throws Exception {

       // 部署流程定义

       InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml");//当前的class路径下

       String deploymentId = processEngine.getRepositoryService()//  

              .createDeployment()//

              .addResourceFromInputStream("test.jpdl.xml", in)//

              .deploy();

       System.out.println("部署流程定义完毕:deploymentId = " + deploymentId);

 

       // 启动流程实例

       ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");

       System.out.println("流程实例启动完毕:processInstanceId = " + pi.getId());

 

      

       Task task = processEngine.getTaskService()//

              .createTaskQuery()// 获取本流程实例中当前情况下仅有的一个任务

              .processInstanceId(pi.getId())//

              .uniqueResult();

 

       String transitionName1 = "to 部门经理审批";

       String transitionName2 = "to 总经理审批";

       // 完成第一步提交申请的任务,要使用指定的Transition离开当前活动

       processEngine.getTaskService().completeTask(task.getId(),transitionName2); // 使用指定名称的Transition离开本活动

    }

}

 

// 向后执行一步

    @Test

    publicvoid testSignalExecution() throws Exception {

       String executionId = "test.130001";

       processEngine.getExecutionService().signalExecutionById(executionId,trsitionName);

       //如果有多个Transition,可以指定路径执行

    }

1.3. 流转控制活动

1.3.1.  start(开始活动)

代表流程的开始边界,一个流程有且只能有一个Start活动。开始活动只能指定一个Transition。在流程实例启动后,会自动的使用这个唯一的Transition离开开始活动,到一下个活动。

不能有Transition指向开始活动。

1.3.2.  end、end-error、end-cancel(结束活动)

代表流程的结束边界,可以有多个,也可以没有。如果有多个,则到达任一个结束活动,整个流程就都结束了;如果没有,则到达最后那个没有Transition的活动,流程就结束了。

1.3.3.  state(状态活动)

功能:等待。

1.3.4.  task(任务活动)

分配任务:

1, actor=#{String型的变量}

任务的执行者动态指定,从流程变量中获取


public class ProcessTest {

 

       privatestatic ProcessEngine processEngine = Configuration.getProcessEngine();

 

       @Test

       publicvoid testProcess() throws Exception {

              //部署流程定义

              InputStreamin = this.getClass().getResourceAsStream("test.jpdl.xml");

              StringdeploymentId = processEngine.getRepositoryService()// 

                            .createDeployment()//

                            .addResourceFromInputStream("test.jpdl.xml",in)//

                            .deploy();

              System.out.println("部署流程定义完毕:deploymentId = " +deploymentId);

 

              //启动流程实例

              Map<String,Object> variables = new HashMap<String, Object>();

              variables.put("manager","王经理");//程序中动态地来指定办理人

              ProcessInstancepi = processEngine.getExecutionService().startProcessInstanceByKey("test",variables);

              System.out.println("流程实例启动完毕:processInstanceId = "+ pi.getId());

       }

 

      

}

 

2, AssignmentHandler,需要在<task>元素中写<assignment-handlerclass="AssignmentHandlerImpl"/>子元素。

a)        指定的类要实现AssignmentHandler接口

b)       在其中可以使用Assignable.setAssignee(String),分配个人任务。

 

<task name="审批2"g="80,113,92,52">

              <assignment-handlerclass="cn.itcast.h_task.AssignmentHandlerImpl"></assignment-handler>

              <transitionname="to 审批"to="审批"g="-47,-17" />

       </task>

publicclass AssignmentHandlerImpl implements AssignmentHandler {

 

    // 计算此任务的办理人,并分配任务

    @Override

    publicvoid assign(Assignable assignable, OpenExecution execution) throws Exception {

       System.out.println("--->AssignmentHandlerImpl.assign()");

       // 计算办理人

       String userId = "李经理--";

 

       // 分配个人任务

       assignable.setAssignee(userId); // 指定个人任务的办理人

 

       // // 分配组任务

       //assignable.addCandidateUser("A"); // 添加一个候选人(组任务)

       //assignable.addCandidateUser("B"); // 添加一个候选人(组任务)

       //assignable.addCandidateUser("C"); // 添加一个候选人(组任务)

    }

 

}

 

1.3.5.  decision(判断活动)

1,使用expression,如:expr="#{'to state2'}"

2,使用Handler,要实现DecisionHandler接口

3,如果同时配置了expression与Handler,则expression有效,忽略Handler。

JBPM4.4:流程定义语言和活动、事件_第1张图片

publicclass DecisionHandlerImpl implements DecisionHandler {

 

    // 计算并返回所要使用的Transition的名称

    //OpenExecution获取到执行的上下文供你调用,最后返回transition的名字

    @Override

    public String decide(OpenExecution execution) {

       System.out.println("--->DecisionHandlerImpl.decide()");

       String user = (String) execution.getVariable("申请人");

 

       if ("员工".equals(user)) {

           return"to 部门经理审批";

       } else {

           return"to 总经理审批";

       }

    }

}

 

 

 

publicclass ProcessTest {

 

    privatestatic ProcessEngine processEngine = Configuration.getProcessEngine();

 

    @Test

    publicvoid testProcess() throws Exception {

       // 部署流程定义

       InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml");

       String deploymentId = processEngine.getRepositoryService()//  

              .createDeployment()//

              .addResourceFromInputStream("test.jpdl.xml", in)//

              .deploy();

       System.out.println("部署流程定义完毕:deploymentId = " + deploymentId);

 

       // 启动流程实例

       ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");

       System.out.println("流程实例启动完毕:processInstanceId = " + pi.getId());

 

       // 完成第一步提交申请的任务,要使用指定的Transition离开当前活动

       Task task = processEngine.getTaskService()//

              .createTaskQuery()// 获取本流程实例中当前情况下仅有的一个任务

              .processInstanceId(pi.getId())//

              .uniqueResult();

       Map<String, Object> variables = new HashMap<String,Object>();

       variables.put("申请人", "员工");

       // variables.put("申请人", "部门经理");

       //如果transition有名字,那么就必须指定名字

       processEngine.getTaskService().completeTask(task.getId(), variables);

    }

}

 

1.3.6.  fork、join(分支/聚合活动)

这是多个分支并行(同时)执行的,并且所有的分支Execution都到Join活动后才离向后执行。

 

publicclass ProcessTest {

 

    privatestatic ProcessEngine processEngine = Configuration.getProcessEngine();

 

    @Test

    publicvoid testProcess() throws Exception {

       // 部署流程定义

       InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml");

       String deploymentId = processEngine.getRepositoryService()//  

              .createDeployment()//

              .addResourceFromInputStream("test.jpdl.xml", in)//

              .deploy();

       System.out.println("部署流程定义完毕:deploymentId = " + deploymentId);

 

       // 启动流程实例

       ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");

       System.out.println("流程实例启动完毕:processInstanceId = " + pi.getId());

       System.out.println("正在执行的活动:" + pi.findActiveActivityNames());

      

    }

}

1.4. 自定义活动(Custom)

1,在<custom>元素中指定class属性为指定的类。

2,这个类要实现ExternalActivityBehaviour接口,其中有两个方法:

       1,execute(ActivityExecution),节点的功能代码

       2,signal(ActivityExecution, String,Map),在当前节点等待时,外部发信号时的行为

       3,在execute()方法中,可以调用以下方法对流程进行控制

              1,ActivityExecution.waitForSignal(),在当前节点等待。

              2,ActivityExecution.takeDefaultTransition(),使用默认的Transition离开,当前节点中定义的第一个为默认的。

              3,ActivityExecution.take(StringtransitionName),使用指定的Transition离开

              4,ActivityExecution.end(),结束流程实例

       4,也可以实现ActivityBehaviour接口,只有一个方法execute(ActivityExecution),这样就不能等待,否则signal时会有类转换异常。

 

1.5. 事件

1, 在根元素中,或在节点元素中,使用<on event="">元素指定事件,其中event属性代表事件的类型。

2, 在<on>中用子元素<event-listener class="EventListenerImpl" />,指定处理的类,要求指定的类要实现EventListener接口

3,  事件类型:

a)        <on>元素放在根元素(<process>)中,可以指定event为start或end,表示流程的开始与结束。

b)       <on>元素放在节点元素中,可以指定event为startend,表示节点的进入与离开

c)        在Start节点中只有end事件,在End节点中只有start事件。

d)       在<transition>元素中直接写<event-listener class="">,就是配置事件。(因为在这里只有一个事件,所以不用写on与类型)

e)        在<task>元素中还可以配置assign事件,是在分配任务时触发的。

你可能感兴趣的:(JBPM4.4:流程定义语言和活动、事件)