Activiti 规则任务(businessRuleTask

作者:邓家海

目前国内研究Activiti规则任务businessRuleTask)的文章在网上应该不超出3篇

小觑夜漫酒作伴,破晓黎明当笑言

前言:

最近一直在研究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 之外的所有流程都会被执行。

官方文档只有这么一点的介绍,然而这里就牵扯到两个新东西了,第一个新东西就是规则任务,它本来就是一个新东西,还有一个东西就是规则任务的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

失败。

提升扩展:

实际应用里面,我们怎么使用的?下面我简单设计一个规则任务说说:

这种情况我们就可以制定规则来执行任务了。而且规则我们后期是可以很灵活更改的,就是说最小代价的去更改。(不用修改代码,不用更改流程)

 

Activiti-businessRuleTask(业务规则任务)相关推荐

  1. Java内嵌Groovy脚本引擎进行业务规则剥离(一)

    2019独角兽企业重金招聘Python工程师标准>>> 一些常见商业应用程序或企业应用,大多都会遇上业务规则在一定的条件下,允许进行一些灵活的配置,以满足业务变化的需要. 解决的方式 ...

  2. groovy 规则引擎 java_Java内嵌Groovy脚本引擎进行业务规则剥离(一)

    一些常见商业应用程序或企业应用,大多都会遇上业务规则在一定的条件下,允许进行一些灵活的配置,以满足业务变化的需要. 解决的方式大致有以下几个方面: 最为传统的方式是java程序直接写死提供几个可调节的 ...

  3. Microsoft Dynamics CRM server 2013 中业务规则,有点像C#的正则表达式

    Microsoft Dynamics CRM server 2013  中业务规则,我的理解就是有点像C#的正则表达式, 如方某个字段,必须输入什么范围的数值,其它字符不能乱输入. 打开方式有二种: ...

  4. python使用箱图法和业务规则进行异常数据处理并检查预测使用的数据特征是否有字段缺失的情况并补齐

    python使用箱图法和业务规则进行异常数据处理并检查预测使用的数据特征是否有字段缺失的情况并补齐 关于预测或者推理的时候特征补齐的情况是这样的: 你在模型训练的时候使用了多少特征,那么在模型预测和推 ...

  5. 关于校验规则(Validation Rule)和业务规则(Bussiness Rule)的思考

    关于校验规则(Validation Rule)和业务规则(Bussiness Rule)的思考 企业应用中常常涉及到校验规则和业务规则.泛而言之,所有的规则都可以称之为业务规则,但是有必要在其中区分出 ...

  6. 【译】如何使用索引视图和一个只有2行的表限制业务规则

    假设一个业务规则规定某些情况不允许存在.并且不允许使用外键进行限制,此时Instead of 触发器可以作为备选答案,但是通常这类触发器在以后带来的麻烦会多于其带来的便利.还有一种解决方式是使用包含唯 ...

  7. 业务规则的生命周期管理

    业务规则将公司从传统的软件开发生命周期(SDLC)中解放了出来,但这并不意味着业务规则的开发和部署不需要任何的监督管理.反而以我的经验来看,业务规则通常是以更为精细的方式进行跟踪管理的.其中,决策逻辑 ...

  8. 需求用例分析之四:业务规则

    作者:张克强 作者微博:张克强-敏捷307 在雅各布森用例分析方法和科伯恩用例分析方法中用例本身其实都没有"业务规则"的属性.但是业界使用中常常会给用例加上这个属性,这是为什么呢? ...

  9. 基于RulesEngine的业务规则实现

    规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务规则做出业务决策.比较常见 ...

最新文章

  1. 牵引力教育分析UI设计在市场饱和度如何?
  2. springboot(二):web综合开发
  3. matlab变量区表示函数,MATLAB中的工作区,变量和函数
  4. qmap不能作为信号与槽的传递_撩妹 | 女生对你有好感的三个信号,千万别错过了...
  5. 【Recat 应用】之 React 脚手架
  6. CheckStyle使用手册(一)
  7. PHP数据表记录自己信息,PHP对数据表记录的操作
  8. postgreSQL源码分析——索引的建立与使用——各种索引类型的管理和操作(1)
  9. Linux link命令
  10. 青囊如可授 从此访鸿蒙的意思,有关于中元节的诗内容
  11. 【翻译】ASML Automatic Streaming Machine Learning
  12. 沿海当地平均海面与85面高程关系
  13. 2020年数学建模国赛C题
  14. Java计算标会(会子)利率
  15. bat文件直接定位到指定目录并等待
  16. 云栖科技评论84期:英国零售商找错了“替罪羊”...
  17. 对于 C 源文件,IntelliSenseMode 已根据编译器参数和查询 compilerPath 从“windo
  18. Thunderbird学校邮箱登录问题
  19. 史上最全微信运营思维导图分享
  20. 《中华人民共和国个人信息保护法》

热门文章

  1. 不论跳不跳槽,简历越早写上这个,越稳!!!
  2. 给我快乐,毋宁给我孤独
  3. Ubuntu 卸载 Docker
  4. 易语言编写的梦空采集器,支持本地Excel来修改数据存档
  5. Java中的类(基础详解)
  6. 2021日喀则市江孜高考成绩查询,预测2021年日喀则中考分数线 多少分上高中
  7. 【老系统改造】---登陆页面加验证码
  8. file-saver导出文件并可设置下载文件名称
  9. Origin2021科研绘图神器
  10. prefetch 和preload_PrefetchPreload预加载方案总结