Activiti 规则任务(businessRuleTask)
Activiti?規(guī)則任務(wù)(businessRuleTask)
作者:鄧家海
目前國內(nèi)研究Activiti規(guī)則任務(wù)businessRuleTask)的文章在網(wǎng)上應(yīng)該不超出3篇
小覷夜漫酒作伴,破曉黎明當(dāng)笑言
前言:
最近一直在研究Activiti工作流的自動化,方便日后實(shí)現(xiàn)辦公自動化奠下基礎(chǔ)。然后查了相關(guān)資料發(fā)現(xiàn)Activity里面有一個(gè)規(guī)則任務(wù)(businessRuleTask),這個(gè)規(guī)則任務(wù)(businessRuleTask)可以通過制定一系列的規(guī)則來實(shí)現(xiàn)流程自動化。但是,當(dāng)我真正去接觸這個(gè)東西的時(shí)候,才發(fā)現(xiàn)很少人做過這個(gè)東西。網(wǎng)絡(luò)上面的相關(guān)資料也幾乎一片空白。我只能自己去鉆研,自己去調(diào)試。耗費(fèi)了一個(gè)周末的晚上時(shí)間,外加一個(gè)星期的晚上時(shí)間。終于突破了這個(gè)關(guān)卡,這個(gè)系列的文章在國內(nèi)網(wǎng)絡(luò)上面應(yīng)該是不多,希望對讀者研究Activity有所幫助。
關(guān)于Activiti規(guī)則任務(wù)(businessRuleTask)官方怎么說的?
描述
業(yè)務(wù)規(guī)則任務(wù)用于同步執(zhí)行一個(gè)或更多規(guī)則。 Activiti 使用 Drools Expert 和 Drool 規(guī)則引擎來執(zhí)行業(yè)務(wù)規(guī)則。 目前而言,包
含有業(yè)務(wù)規(guī)則的.drl 文件必須與定義了業(yè)務(wù)規(guī)則任務(wù)的流程定義一同部署才能執(zhí)行這些規(guī)則。這意味著在流程中使用的所
有.drl 文件必須像任務(wù)表單一樣被打包進(jìn)流程的 BAR 文件中。更多關(guān)于使用 Drool Expert 來創(chuàng)建業(yè)務(wù)規(guī)則的信息,請參考
Jboss Drools 上的 Drools 文檔。
圖形化符號
業(yè)務(wù)規(guī)則任務(wù)是使用表格圖標(biāo)來表示的。
XML 表示
要執(zhí)行部署在與流程定義所在 BAR 文件中的一個(gè)或更多業(yè)務(wù)規(guī)則,我們需要定義輸入變量和結(jié)果變量。對于輸入變量的
定義,可以定義一個(gè)由逗號分隔的流程變量列表。輸出變量的定義可以只包含一個(gè)變量名,用來將執(zhí)行過的業(yè)務(wù)規(guī)則的
輸出對象存儲到一個(gè)流程變量中。注意,結(jié)果變量將包含一個(gè)對象列表。如果沒有指定結(jié)果的變量名,默認(rèn)使用
org.activiti.engine.rules.OUPUT。
下面的業(yè)務(wù)規(guī)則任務(wù)會執(zhí)行所有隨流程定義一塊部署的規(guī)則:
<processid="simpleBusinessRuleProcess">
<startEventid="theStart"/>
<sequenceFlowsourceRef="theStart"targetRef="businessRuleTask"/>
<businessRuleTaskid="businessRuleTask"activiti:ruleVariablesInput="${order}"
activiti:resultVariable="rulesOutput"/>
<sequenceFlowsourceRef="businessRuleTask"targetRef="theEnd"/>
<endEventid="theEnd"/>
</process>
也可以配置業(yè)務(wù)規(guī)則任務(wù)讓它只執(zhí)行被部署的.drl 文件中定義的一組規(guī)則。由逗號分隔開的規(guī)則名列表必須像這樣來指定:
<businessRuleTaskid="businessRuleTask"activiti:ruleVariablesInput="${order}"
activiti:rules="rule1, rule2"/>
這個(gè)例子中,只有 rule1 和 role2 會執(zhí)行。
你也可以定義一個(gè)不會被執(zhí)行的規(guī)則列表。
<businessRuleTaskid="businessRuleTask"activiti:ruleVariablesInput="${order}"
activiti:rules="rule1, rule2"exclude="true"/>
在這個(gè)例子中,與流程定義部署在同一個(gè) BAR 文件中,除了 rule1 和 rule2 之外的所有流程都會被執(zhí)行。
?
官方文檔只有這么一點(diǎn)的介紹,然而這里就牽扯到兩個(gè)新東西了,第一個(gè)新東西就是規(guī)則任務(wù),它本來就是一個(gè)新東西,還有一個(gè)東西就是規(guī)則任務(wù)的Drools 規(guī)則。
?
什么是Drools ?
Drools(JBoss Rules )具有一個(gè)易于訪問企業(yè)策略、易于調(diào)整以及易于管理的開源業(yè)務(wù)規(guī)則引擎,符合業(yè)內(nèi)標(biāo)準(zhǔn),速度快、效率高。業(yè)務(wù)分析師或?qū)徍巳藛T可以利用它輕松查看業(yè)務(wù)規(guī)則,從而檢驗(yàn)是否已編碼的規(guī)則執(zhí)行了所需的業(yè)務(wù)規(guī)則。
?
開發(fā)步驟:
(1)準(zhǔn)備必須的jar包
(2)設(shè)計(jì)規(guī)則任務(wù)
(3)編寫代碼實(shí)現(xiàn)
(4)編寫Drools規(guī)則
(5)部署運(yùn)行
?
必須的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
?
設(shè)計(jì)規(guī)則任務(wù)
?
?
?
規(guī)則任務(wù)很簡單,一個(gè)開始節(jié)點(diǎn),結(jié)束節(jié)點(diǎn),還有一個(gè)規(guī)則任務(wù)節(jié)點(diǎn)。至于實(shí)際應(yīng)用里面,自己去設(shè)計(jì)更多的規(guī)則。只要啟動了流程后,這一整個(gè)流程都是自動執(zhí)行的。這就是所謂的自動化,當(dāng)然前提是制定好規(guī)則。
?
規(guī)則任務(wù)的代碼:
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="規(guī)則任務(wù)" 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規(guī)則
Drools規(guī)則我就不仔細(xì)說,如果對drools規(guī)則不熟悉的,可以自行去查閱相關(guān)的資料。關(guān)于drools規(guī)則的資料還是不少的。而且drools規(guī)則也很容易入門上手。
?
代碼:
?
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
?
?
?
這個(gè)代碼的實(shí)現(xiàn)就是說,當(dāng)流程設(shè)計(jì)里面有這個(gè)規(guī)則,流程就會跑進(jìn)這個(gè)規(guī)則里面去干一些事情。拿我設(shè)計(jì)的流程來說,我設(shè)置了rule1,rule2,所以流程就會去判斷Value < 3或者Value =3,如果滿足Value = 3,就會執(zhí)行 ??u.PrintOut("Success!Value==3");輸出uccess!Value==3,如果Value <3就會執(zhí)行 ?u.PrintOut("Success!Value<3"); 輸出Success!Value<3。
?
?
?
??
其中,rule1,rule2是在設(shè)計(jì)規(guī)則任務(wù)的時(shí)候填寫的規(guī)則,設(shè)計(jì)的時(shí)候在rule的這一項(xiàng)里面填上規(guī)則,多個(gè)規(guī)則要用逗號隔開。
?
?
?
?
?
代碼實(shí)現(xiàn)
?
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 * 項(xiàng)目名稱:lightmvc 20 21 * 類名稱:Rule 22 23 * 類描述: 24 25 * 創(chuàng)建人:鄧家海 26 27 * 創(chuàng)建時(shí)間:2017年6月17日 下午10:20:55 28 29 * 修改人:deng 30 31 * 修改時(shí)間: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 }
?
?
?
部署運(yùn)行
運(yùn)行結(jié)果:
?
?
?
?
注意事項(xiàng):部署的時(shí)候一般三個(gè)文件一起部署,最好使用壓縮包的部署方式,部署清單(.drl+bpmn.xml+.png)
?
至少也要(.drl+bpmn.xml)
不能分開部署,分開部署會導(dǎo)致deployment 175011 doesn't contain any rules
?
失敗。
?
提升擴(kuò)展:
實(shí)際應(yīng)用里面,我們怎么使用的?下面我簡單設(shè)計(jì)一個(gè)規(guī)則任務(wù)說說:
?
?
?
?
這種情況我們就可以制定規(guī)則來執(zhí)行任務(wù)了。而且規(guī)則我們后期是可以很靈活更改的,就是說最小代價(jià)的去更改。(不用修改代碼,不用更改流程)
?
?Activiti交流QQ群:634320089
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/dengjiahai/p/7051288.html
總結(jié)
以上是生活随笔為你收集整理的Activiti 规则任务(businessRuleTask)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个含义深刻的个性签名!
- 下一篇: 汇编试验十五:安装新的int 9中断例程