Activity 规则任务(businessRuleTask)

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

失败。

提升扩展:

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

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

 

 

 

时间: 2024-10-29 19:11:48

Activity 规则任务(businessRuleTask)的相关文章

Android——Fragment介绍及两种基本使用方法

今天在调ViewPager的时候,感觉ViewPager+Fragment这种做法更灵活,所以,现在拿出来Fragment再整理下. 一,为什么要用Fragment 1,灵活布局 Fragment表现Activity中用UI的一个行为或者一部分.可以组合多个fragment放在一个单独的activity中来创建一个多界面区域的UI,并可以在多个activity里重用某一个fragment.把fragment想象成一个activity的模块化区域,有它自己的生命周期,接收属于它的输入事件,并且可以

Fragment生命周期详解

Fragment生命周期详解 1. Fragment概述 Fragment从Android v3.0版本开始引入 随着界面布局的复杂化,处理起来也更加的复杂,引入Fragment可以把activity拆分成各个部分.每个Fragment都有它自己的布局和生命周期.方便了开发. 采用fragment而不是activity进行应用的UI管理,可绕开Android系统activity规则的限制. fragment是一种控制器对象,activity可委派它完成一些任务通常这些任务就是管理用户界面.受管的

activiti modeler 任务节点自定义属性扩展

在工作中使用Activiti modeler时难免会遇到局限,如usertask中的属性,完全不够用,这时需要我们去扩展. activiti modeler通过读取stencilset.json生成编辑器UI,在界面上的扩展需要了解stencilset.json配置文件,它定义元素的属性,规则的配置文件,页面的展示就是根据这个配置文件生成的. 配置文件说明: --属性的定义 "propertyPackages" : [ { "name" : "proces

Activity 中 intent 匹配规则

要想使用隐式 Intent 成功启动 Activity, 必须保证 Intent 中 action.category.data 的设置和要启动的 Activity 的 IntentFilter 相匹配. Intent 和 IntentFilter 的使用方法: IntentFilter 中可以设置上的 1-n 个 action.0-n 个 category.0-n 个data Intent 上可以设置 1-n 个 action.0-n 个 category.1 个 data IntentFilt

第一章:Activity的生命周期和启动模式

Activity是Android中四大组件之首,所以需要重视,尤其是启动方式,在AndroidManifest.xml中的注册信息 (一)Activity的生命周期 1.1.1 正常情况下的生命周期 说明 (1)针对一个特定的Activity,第一次启动顺序:onCreate->onStart->onResume. (2)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause->onStop (3)返回原Activity时,回调如下:onRestart->on

android Application Component研究之Activity(一)

http://blog.csdn.net/windskier/article/details/7096521 终于下定决心写写ActivityManagerService的源码分析的文章了,ActivityManagerService 业务的整个逻辑关系被各种复杂的数据结构包裹着,因此对ActivityManagerService 的分析主要就是对各种数据结构的分析,明白了这些数据结构,理解ActivityManagerService的业务内容就水到渠成了. AMS提供了一个ArrayList

android Application Component研究之Activity(二)

http://blog.csdn.net/windskier/article/details/7172710 本文为原创文章,欢迎转载!转载时请注明出处:http://blog.csdn.net/windskier 上篇文章分析完了task的创建或者复用,接下来接着分析activity在启动过程中还有哪些工作需要去完成?首先给出整个activity的过程图. 1. Starting Window 当该activity运行在新的task中或者进程中时,需要在activity显示之前显示一个Star

三分钟了解Activity工作流

一. 什么是工作流 以请假为例,现在大多数公司的请假流程是这样的 员工打电话(或网聊)向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请假录入电脑 采用工作流技术的公司的请假流程是这样的 员工使用账户登录系统——点击请假——上级登录系统点击允许 就这样,一个请假流程就结束了 有人会问,那上级不用向公司提交请假记录?公司不用将记录录入电脑?答案是,用的.但是这一切的工作都会在上级点击允许后自动运行! 这就是工作流技术. Georgakopoulos给出的

xUtils更新到3.0后的基本使用规则

说实话,对于xUtils,是我最近才用到的开发框架(也是刚接触),对于其功能不得不说,简化了很多的开发步骤,可以说是非常好的开发工具,但是其最近更新到3.0也没有解决加载自定义ImageView报错的问题. 我总是喜欢用一些最新的东西,xUtils 3.0才刚更新,是一次比较大的重构,对于百度到的使用规则,基本都是3.0以前的,使得用3.0的开发者需要求解用法的时候,遇到许多阻碍,故此在这里简单介绍xUtils 3.0的使用规则.关于怎么导入功能,其实并不是本文的内容,不过在此文最后一节简单讲解