Activiti-businessRuleTask(業務規則任務)

Activiti 規則任務(businessRuleTask

做者:鄧家海java

目前國內研究Activiti規則任務businessRuleTask)的文章在網上應該不超出3篇express

小覷夜漫酒做伴,破曉黎明當笑言api

前言:

最近一直在研究Activiti工做流的自動化,方便往後實現辦公自動化奠下基礎。而後查了相關資料發現Activity裏面有一個規則任務(businessRuleTask),這個規則任務(businessRuleTask)能夠經過制定一系列的規則來實現流程自動化。可是,當我真正去接觸這個東西的時候,才發現不多人作過這個東西。網絡上面的相關資料也幾乎一片空白。我只能本身去鑽研,本身去調試。耗費了一個週末的晚上時間,外加一個星期的晚上時間。終於突破了這個關卡,這個系列的文章在國內網絡上面應該是很少,但願對讀者研究Activity有所幫助。網絡

關於Activiti規則任務(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 以外的全部流程都會被執行。mvc

 

官方文檔只有這麼一點的介紹,然而這裏就牽扯到兩個新東西了,第一個新東西就是規則任務,它原本就是一個新東西,還有一個東西就是規則任務的Drools 規則。this

 

什麼是Drools ?

Drools(JBoss Rules )具備一個易於訪問企業策略、易於調整以及易於管理的開源業務規則引擎,符合業內標準,速度快、效率高。業務分析師或審覈人員能夠利用它輕鬆查看業務規則,從而檢驗是否已編碼的規則執行了所需的業務規則。編碼

 

開發步驟:spa

(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

 

失敗。

 

提高擴展:

實際應用裏面,咱們怎麼使用的?下面我簡單設計一個規則任務說說:

 

 

 

 

這種狀況咱們就能夠制定規則來執行任務了。並且規則咱們後期是能夠很靈活更改的,就是說最小代價的去更改。(不用修改代碼,不用更改流程)

相關文章
相關標籤/搜索