Activity 规则任务(businessRuleTask)
作者:邓家海
目前国内研究Activity规则任务businessRuleTask)的文章在网上应该不超出3篇
小觑夜漫酒作伴,破晓黎明当笑言
前言:
最近一直在研究Activity工作流的自动化,方便日后实现办公自动化奠下基础。然后查了相关资料发现Activity里面有一个规则任务(businessRuleTask),这个规则任务(businessRuleTask)可以通过制定一系列的规则来实现流程自动化。但是,当我真正去接触这个东西的时候,才发现很少人做过这个东西。网络上面的相关资料也几乎一片空白。我只能自己去钻研,自己去调试。耗费了一个周末的晚上时间,外加一个星期的晚上时间。终于突破了这个关卡,这个系列的文章在国内网络上面应该是不多,希望对读者研究Activity有所帮助。
关于Activity规则任务(businessRuleTask)官方怎么说的?
描述
业务规则任务用于同步执行一个或更多规则。 Activiti 使用 Drools Expert 和 Drool 规则引擎来执行业务规则。 目前而言,包
含有业务规则的.drl 文件必须与定义了业务规则任务的流程定义一同部署才能执行这些规则。这意味着在流程中使用的所
有.drl 文件必须像任务表单一样被打包进流程的 BAR 文件中。更多关于使用 Drool Expert 来创建业务规则的信息,请参考
Jboss Drools 上的 Drools 文档。
图形化符号
业务规则任务是使用表格图标来表示的。
XML 表示
要执行部署在与流程定义所在 BAR 文件中的一个或更多业务规则,我们需要定义输入变量和结果变量。对于输入变量的
定义,可以定义一个由逗号分隔的流程变量列表。输出变量的定义可以只包含一个变量名,用来将执行过的业务规则的
输出对象存储到一个流程变量中。注意,结果变量将包含一个对象列表。如果没有指定结果的变量名,默认使用
org.activiti.engine.rules.OUPUT。
下面的业务规则任务会执行所有随流程定义一块部署的规则:
<processid="simpleBusinessRuleProcess">
<startEventid="theStart"/>
<sequenceFlowsourceRef="theStart"targetRef="businessRuleTask"/>
<businessRuleTaskid="businessRuleTask"activiti:ruleVariablesInput="${order}"
activiti:resultVariable="rulesOutput"/>
<sequenceFlowsourceRef="businessRuleTask"targetRef="theEnd"/>
<endEventid="theEnd"/>
</process>
也可以配置业务规则任务让它只执行被部署的.drl 文件中定义的一组规则。由逗号分隔开的规则名列表必须像这样来指定:
<businessRuleTaskid="businessRuleTask"activiti:ruleVariablesInput="${order}"
activiti:rules="rule1, rule2"/>
这个例子中,只有 rule1 和 role2 会执行。
你也可以定义一个不会被执行的规则列表。
<businessRuleTaskid="businessRuleTask"activiti:ruleVariablesInput="${order}"
activiti:rules="rule1, rule2"exclude="true"/>
在这个例子中,与流程定义部署在同一个 BAR 文件中,除了 rule1 和 rule2 之外的所有流程都会被执行。
官方文档只有这么一点的介绍,然而这里就牵扯到两个新东西了,第一个新东西就是规则任务,它本来就是一个新东西,还有一个东西就是规则任务的Drools 规则。
什么是Drools ?
Drools(JBoss Rules )具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。
开发步骤:
(1)准备必须的jar包
(2)设计规则任务
(3)编写代码实现
(4)编写Drools规则
(5)部署运行
必须的jar包:
knowledge-api-6.4.0.Final.jar
drools-core-6.4.0.Final.jar
droolsjbpm-knowledge-services-6.0.0.Alpha9.jar
drools-compiler-6.4.0.Final.jar
knowledge-internal-api-5.6.0.Final.jar
kie-api-6.4.0.Final.jar
mvel2-2.3.1.Final.jar
antlr-runtime-3.5.2.jar
kie-internal-6.4.0.Final.jar
设计规则任务
规则任务很简单,一个开始节点,结束节点,还有一个规则任务节点。至于实际应用里面,自己去设计更多的规则。只要启动了流程后,这一整个流程都是自动执行的。这就是所谓的自动化,当然前提是制定好规则。
规则任务的代码:
1 <?xml version=‘1.0‘ encoding=‘UTF-8‘?> 2 3 <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef"> 4 5 <process id="process" isExecutable="true"> 6 7 8 9 <startEvent id="sid-2A81E362-DCDF-45AF-8F01-BBF1AD5A08AB" /> 10 11 <businessRuleTask id="sid-E45C70B0-D9A4-4492-B1CD-D92845553C2B" name="规则任务" activiti:rules="rule1,rule2" activiti:ruleVariablesInput="${Value}" activiti:resultVariable="result" > 12 13 <extensionElements> 14 15 <activiti:executionListener event="task" class="light.mvc.workflow.taskListener.RuleListenerImpl"></activiti:executionListener> 16 17 </extensionElements> 18 19 </businessRuleTask> 20 21 <endEvent id="sid-C52E0189-4FC3-45E2-BA2D-DAD47E6E24FB" /> 22 23 <sequenceFlow id="sid-F77516EB-4BEC-40D5-BC85-178F0C3BEAB6" sourceRef="sid-E45C70B0-D9A4-4492-B1CD-D92845553C2B" targetRef="sid-C52E0189-4FC3-45E2-BA2D-DAD47E6E24FB" /> 24 25 <sequenceFlow id="sid-3A813C3C-2657-4EC4-8E34-E3921439474E" sourceRef="sid-2A81E362-DCDF-45AF-8F01-BBF1AD5A08AB" targetRef="sid-E45C70B0-D9A4-4492-B1CD-D92845553C2B" /> 26 27 </process> 28 29 <bpmndi:BPMNDiagram id="BPMNDiagram_process"> 30 31 <bpmndi:BPMNPlane bpmnElement="process" id="BPMNPlane_process"> 32 33 <bpmndi:BPMNShape bpmnElement="sid-2A81E362-DCDF-45AF-8F01-BBF1AD5A08AB" id="BPMNShape_sid-2A81E362-DCDF-45AF-8F01-BBF1AD5A08AB"> 34 35 <omgdc:Bounds height="30.0" width="30.0" x="192.75" y="87.0" /> 36 37 </bpmndi:BPMNShape> 38 39 <bpmndi:BPMNShape bpmnElement="sid-E45C70B0-D9A4-4492-B1CD-D92845553C2B" id="BPMNShape_sid-E45C70B0-D9A4-4492-B1CD-D92845553C2B"> 40 41 <omgdc:Bounds height="80.0" width="100.0" x="313.75" y="62.0" /> 42 43 </bpmndi:BPMNShape> 44 45 <bpmndi:BPMNShape bpmnElement="sid-C52E0189-4FC3-45E2-BA2D-DAD47E6E24FB" id="BPMNShape_sid-C52E0189-4FC3-45E2-BA2D-DAD47E6E24FB"> 46 47 <omgdc:Bounds height="28.0" width="28.0" x="458.75" y="88.0" /> 48 49 </bpmndi:BPMNShape> 50 51 <bpmndi:BPMNEdge bpmnElement="sid-F77516EB-4BEC-40D5-BC85-178F0C3BEAB6" id="BPMNEdge_sid-F77516EB-4BEC-40D5-BC85-178F0C3BEAB6"> 52 53 <omgdi:waypoint x="413.75" y="102.0" /> 54 55 <omgdi:waypoint x="458.75" y="102.0" /> 56 57 </bpmndi:BPMNEdge> 58 59 <bpmndi:BPMNEdge bpmnElement="sid-3A813C3C-2657-4EC4-8E34-E3921439474E" id="BPMNEdge_sid-3A813C3C-2657-4EC4-8E34-E3921439474E"> 60 61 <omgdi:waypoint x="222.75" y="102.0" /> 62 63 <omgdi:waypoint x="313.75" y="102.0" /> 64 65 </bpmndi:BPMNEdge> 66 67 </bpmndi:BPMNPlane> 68 69 </bpmndi:BPMNDiagram> 70 71 </definitions>
编写Drools规则
Drools规则我就不仔细说,如果对drools规则不熟悉的,可以自行去查阅相关的资料。关于drools规则的资料还是不少的。而且drools规则也很容易入门上手。
代码:
1 package com.product; 2 3 import light.mvc.workflow.fact.Rule; 4 5 rule "rule1" 6 7 when 8 9 u : Rule(Value == 3); 10 11 then 12 13 u.PrintOut("Success!Value==3"); 14 15 end 16 17 rule "rule2" 18 19 when 20 21 u : Rule(Value < 3); 22 23 then 24 25 u.PrintOut("Success!Value<3"); 26 27 end 28 29 rule "rule3" 30 31 when 32 33 u : Rule(Value > 3); 34 35 then 36 37 u.PrintOut("Success!Value>3"); 38 39 40 41 end
这个代码的实现就是说,当流程设计里面有这个规则,流程就会跑进这个规则里面去干一些事情。拿我设计的流程来说,我设置了rule1,rule2,所以流程就会去判断Value < 3或者Value =3,如果满足Value = 3,就会执行 u.PrintOut("Success!Value==3");输出uccess!Value==3,如果Value <3就会执行 u.PrintOut("Success!Value<3"); 输出Success!Value<3。
其中,rule1,rule2是在设计规则任务的时候填写的规则,设计的时候在rule的这一项里面填上规则,多个规则要用逗号隔开。
代码实现
1 /** 2 3 * 4 5 */ 6 7 package light.mvc.workflow.fact; 8 9 10 11 import java.io.Serializable; 12 13 14 15 /** 16 17 * 18 19 * 项目名称:lightmvc 20 21 * 类名称:Rule 22 23 * 类描述: 24 25 * 创建人:邓家海 26 27 * 创建时间:2017年6月17日 下午10:20:55 28 29 * 修改人:deng 30 31 * 修改时间:2017年6月17日 下午10:20:55 32 33 * 修改备注: 34 35 * @version 36 37 * 38 39 */ 40 41 42 43 public class Rule implements Serializable { 44 45 public Rule(int Value){ 46 47 System.out.println(this.Value); 48 49 } 50 51 private int Value=3; 52 53 54 55 /** 56 57 * @return the value 58 59 */ 60 61 public int getValue() { 62 63 return Value; 64 65 } 66 67 68 69 /** 70 71 * @param value the value to set 72 73 */ 74 75 public void setValue(int value) { 76 77 Value = value; 78 79 } 80 81 82 83 public void PrintOut(String str){ 84 85 System.out.println(str); 86 87 } 88 89 }
部署运行
运行结果:
注意事项:部署的时候一般三个文件一起部署,最好使用压缩包的部署方式,部署清单(.drl+bpmn.xml+.png)
至少也要(.drl+bpmn.xml)
不能分开部署,分开部署会导致deployment 175011 doesn‘t contain any rules
失败。
提升扩展:
实际应用里面,我们怎么使用的?下面我简单设计一个规则任务说说:
这种情况我们就可以制定规则来执行任务了。而且规则我们后期是可以很灵活更改的,就是说最小代价的去更改。(不用修改代码,不用更改流程)