JBPM(七)详解流程图

概念:

流程图的组成:

a. 活动 Activity / 节点 Node

b. 流转 Transition / 连线(单向箭头)

c. 事件

 

1.流转(Transition)

a) 一般情况一个活动中可以指定一个或多个Transition

i. 开始活动(Start)中只能有一个Transition

ii. 结束活动(End)中没有Transition

iii. 其他活动中有一条或多条Transition

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

2.活动(Activity)

a) 流转控制活动(预定义活动)

i. start开始活动

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

ii. end/end-error/end-cancel(结束活动)

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

iii. state状态活动

作用:等待。可以使用signal使其结束等待,并向后执行一步。

iv. task任务活动

-->个人任务的分配

1. 使用流程变量:assignee="#{manager}"

2. AssignmentHandlerassignable.setAssignee(userId); // 指定当前任务的办理人(分配任务)

a) 需要在.jbdl.xml<task>元素中写

[html]  view plain  copy
  1. <assignment-handler class="cn.grace.AssignmentHandlerImpl"/>  

b) 指定的AssignmentHandlerImpl类要实现AssignmentHandler接口

c) 在AssignmentHandlerImpl类中可以使用assignable.setAssignee(userId),分配个人任务。

3. TaskService.assignTask(taskId, userId)// 把指定的任务分配给指定的人

processEngine.getTaskService().assignTask(taskId, userId);

-->组任务的分配

1.  使用流程变量:assignee="#{userIdsString}" // 要是String型的变量,多个候选人之前用','隔开

2. AssignmentHandlerassignable.addCandidateUser(userId);// 添加组任务的候选人

a) 需要在.jbdl.xml<task>元素中写

[html]  view plain  copy
  1. <assignment-handler class="cn.grace.GroupTaskAssignmentHandlerImpl"/>  

b) 指定的AssignmentHandlerImpl类要实现AssignmentHandler接口

c) 在AssignmentHandlerImpl类中可以使用assignable.addCandidateUser(userId),添加组任务候选人。

3. TaskService.addTaskParticipatingUser(taskId,userId,Participation.CANDIDATE);//添加组任务的候选人 

v. Decision判断活动

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

2. 使用Handler在Handler Class里配置指定的DecisionHandlerImpl类的路径

DecisionHandlerImpl.java

[java]  view plain  copy
  1. public class DecisionHandlerImpl implements DecisionHandler {  
  2.   
  3.     // 计算离开当前节点用的Transition的名称并返回  
  4.     @Override  
  5.     public String decide(OpenExecution execution) {  
  6.         System.out.println("DecisionHandlerImpl.decide()");  
  7.         // 获取业务数据  
  8.         Integer days = (Integer) execution.getVariable("请假天数");  
  9.         // 选择Transition  
  10.         if (days > 7) {  
  11.             return "to 总经理审批";  
  12.         } else {  
  13.             return "to end1";  
  14.         }  
  15.     }  
  16. }  

ProcessTest.java

[java]  view plain  copy
  1. @Test  
  2. public void test() {  
  3.     // 1,部署流程定义  
  4.     InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml"); 
  5.     processEngine.getRepositoryService()//  
  6.             .createDeployment()//  
  7.             .addResourceFromInputStream("test.jpdl.xml", in)//  
  8.             .deploy();  
  9.   
  10.     // 2,启动流程实例  
  11.     Map<String, Object> variables = new HashMap<String, Object>();  
  12.     // variables.put("请假天数", 10);启动流程实例后,进行到to 总经理审批环节。  
  13.     variables.put("请假天数"3);//启动流程实例后,进行到to end1环节。  
  14.     ProcessInstance pi = processEngine.getExecutionService()
  15.                                 .startProcessInstanceByKey("test", variables);  
  16. }  

此时,如果variables.put("请假天数", 3);启动流程实例后,进行到to end1环节。

此时,如果variables.put("请假天数", 10);启动流程实例后,进行到to 总经理审批环节。

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

vi. forkjoin分支/聚合活动

[java]  view plain  copy
  1. public class ProcessTest {  
  2.   
  3.     private ProcessEngine processEngine = Configuration.getProcessEngine();  
  4.   
  5.     @Test  
  6.     public void test() {  
  7.         // 1,部署流程定义  
  8.         InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml"); 
  9.         processEngine.getRepositoryService()//  
  10.                 .createDeployment()//  
  11.                 .addResourceFromInputStream("test.jpdl.xml", in)//  
  12.                 .deploy();  
  13.   
  14.         // 2,启动流程实例  
  15.         ProcessInstance pi = processEngine.getExecutionService()
  16.                                         .startProcessInstanceByKey("test");  
  17.         System.out.println("processInstanceId = " + pi.getId());  
  18.         System.out.println("当前正在执行的活动:" + pi.findActiveActivityNames());  
  19.     }  
  20. }  

输出结果为:

processInstanceId = test.330007

当前正在执行的活动:[汇款, 发货]

可以看出,汇款和发货同时执行中。并且,只有当2条路线都到join活动,流程才会继续往后执行。

b) 自定义活动(custom)

i. 在<custom>元素中指定class属性为指定的类ExternalActivityBehaviourImpl

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

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

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

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

a) ActivityExecution.waitForSignal():在当前节点等待。

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

c) ActivityExecution.take(String transitionName):使用指定的Transition离开

d) ActivityExecution.end():结束流程实例

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

[java]  view plain  copy
  1. public class ExternalActivityBehaviourImpl implements ExternalActivityBehaviour {  
  2.   
  3.     // 到达这个活动时执行的方法  
  4.     @Override  
  5.     public void execute(ActivityExecution execution) throws Exception {  
  6.         System.out.println("已发送信息.");//此处写自己要执行的事件  
  7.   
  8.         // 默认是执行完代码后离开当前活动,不会执行signal方法,也可以写如下代码  
  9.         // execution.takeDefaultTransition(); // 离开当前活动  
  10.   
  11.         // // 使用指定名称的Transition离开当前活动  
  12.         // execution.take(transitionName);  
  13.   
  14.         // 执行完后不要离开,而是要等待外部调用signal()方法时才离开  
  15.         execution.waitForSignal();  
  16.     }  
  17.   
  18.     // 调用signal()方法离开当前节点前执行的方法(如果在execute()中直接离开当前节点了,
  19.     // 这个方法就不会被执行)  
  20.     @Override  
  21.     public void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {  
  22.         System.out.println("ExternalActivityBehaviourImpl.signal()");  
  23.     }  
  24. }  

3.事件

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

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

c) 事件类型:

i. <on>元素放在根元素(<process>)中,可以指定eventstartend,表示流程的开始与结束。

ii. <on>元素放在节点元素中,可以指定eventstartend,表示节点的进入与离开

iii. 在Start节点中只有end事件,在End节点中只有start事件。

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

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

 

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process name="test" xmlns="http://jbpm.org/4.4/jpdl">  
  4.   
  5.     <!-- 流程实例的启动事件 -->  
  6.     <on event="start">  
  7.         <event-listener class="cn.grace.EventListenerImpl"></event-listener>  
  8.     </on>  
  9.     <!-- 流程实例的结束事件 -->  
  10.     <on event="end">  
  11.         <event-listener class="cn.grace.EventListenerImpl"></event-listener>  
  12.     </on>  
  13.   
  14.     <start name="start1" g="86,69,7,1">  
  15.         <!-- 开始活动中只有离开活动的事件 -->  
  16.         <on event="end">  
  17.             <event-listener class="cn.grace.EventListenerImpl"></event-listener>  
  18.         </on>  
  19.         <transition name="to task1" to="task1" g="-53,-17" />  
  20.     </start>  
  21.   
  22.     <task name="task1" g="61,171,92,52" assignee="张三">  
  23.         <!-- 进入活动的事件 -->  
  24.         <on event="start">  
  25.             <event-listener class="cn.grace.EventListenerImpl"></event-listener>  
  26.         </on>  
  27.         <!--离开活动的事件 -->  
  28.         <on event="end">  
  29.             <event-listener class="cn.grace.EventListenerImpl"></event-listener>  
  30.         </on>  
  31.         <transition name="to end1" to="end1" g="-47,-17" />  
  32.     </task>  
  33.   
  34.     <end name="end1" g="86,272,48,48">  
  35.         <!-- 结束活动中只有进入活动的事件 -->  
  36.         <on event="start">  
  37.             <event-listener class="cn.grace.EventListenerImpl"></event-listener>  
  38.         </on>  
  39.     </end>  
  40. </process>  

根据上述.jpdl.xml和对应的.png图,启动流程实例会执行3次 EventListenerImpl 事件,结束流程实例也会执行3次 EventListenerImpl 事件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2017年jBPM 正式发布了全新的 7版本jBPM 是一个完全开源的业务流程管理(BPM)和案例管理解决方案。它支持流程和案例的完整生命周期,从编写工具到执行一直到监控和管理。 在核心引擎之上,提供了许多功能和工具来支持整个生命周期中的业务流程: 基于Eclipse和基于Web的编辑器,用于支持业务流程的图形化创建(拖放)。 基于JPA / JTA的可插拔持久性和事务。 基于WS-HumanTask的可插拔人工任务服务,用于包含需要由人类执行者执行的任务。 管理控制台支持流程实例管理,任务列表和任务表单管理以及报告。 部署流程的可选流程仓库(和其他相关知识)。 历史记录(用于查询/监视/分析)。 与Seam,Spring,OSGi等集成 BPM通过以业务用户和开发人员喜欢的方式提供流程管理功能和工具,从而实现业务分析师,开发人员和最终用户之间的桥梁。域特定的节点可以插入调色板,使业务用户更容易理解这些过程。 jBPM支持自适应和动态过程,需要灵活性来模拟复杂的现实生活中的情况,这些情况不能用刚性过程轻松描述。我们通过允许他们控制进程的哪些部分来执行,动态地偏离进程等,使控制回到终端用户。 jBPM也不仅仅是一个独立的流程引擎。复杂的业务逻辑可以被建模为业务流程与业务规则和复杂事件处理的组合。jBPM可以与Drools项目相结合,以支持将这些范例集成到一起的统一环境,您可以将业务逻辑作为过程,规则和事件的组合进行建模。 工作是MAVEN+eclipse jBPM jars也可以在中央maven仓库中使用 (也可以在JBoss maven仓库中)。 如果您使用Maven,只需添加一个依赖关系pom.xml: org.jbpm jbpm-test 7.3.0.Final 这与Gradle,Ivy和Buildr类似。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值