做者:鄧家海java
目前國內研究Activiti規則任務businessRuleTask)的文章在網上應該不超出3篇express
小覷夜漫酒做伴,破曉黎明當笑言api
最近一直在研究Activiti工做流的自動化,方便往後實現辦公自動化奠下基礎。而後查了相關資料發現Activity裏面有一個規則任務(businessRuleTask),這個規則任務(businessRuleTask)能夠經過制定一系列的規則來實現流程自動化。可是,當我真正去接觸這個東西的時候,才發現不多人作過這個東西。網絡上面的相關資料也幾乎一片空白。我只能本身去鑽研,本身去調試。耗費了一個週末的晚上時間,外加一個星期的晚上時間。終於突破了這個關卡,這個系列的文章在國內網絡上面應該是很少,但願對讀者研究Activity有所幫助。網絡
描述
業務規則任務用於同步執行一個或更多規則。 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 以外的全部流程都會被執行。mvc
官方文檔只有這麼一點的介紹,然而這裏就牽扯到兩個新東西了,第一個新東西就是規則任務,它原本就是一個新東西,還有一個東西就是規則任務的Drools 規則。this
Drools(JBoss Rules )具備一個易於訪問企業策略、易於調整以及易於管理的開源業務規則引擎,符合業內標準,速度快、效率高。業務分析師或審覈人員能夠利用它輕鬆查看業務規則,從而檢驗是否已編碼的規則執行了所需的業務規則。編碼
開發步驟:spa
(1)準備必須的jar包設計
(2)設計規則任務調試
(3)編寫代碼實現
(4)編寫Drools規則
(5)部署運行
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規則也很容易入門上手。
代碼:
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
失敗。
實際應用裏面,咱們怎麼使用的?下面我簡單設計一個規則任務說說:
這種狀況咱們就能夠制定規則來執行任務了。並且規則咱們後期是能夠很靈活更改的,就是說最小代價的去更改。(不用修改代碼,不用更改流程)