当前位置: 首页 > 编程日记 > 正文

Activiti 规则任务(businessRuleTask)

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交流QQ群:634320089

 

转载于:https://www.cnblogs.com/dengjiahai/p/7051288.html

相关文章:

10年工作经验老程序员推荐的7个开发类工具

做.NET软件工作已经10年了&#xff0c;从程序员做到高级程序员&#xff0c;再到技术主管&#xff0c;技术总监。见证了Visual Studio .NET 2003,Visul Studio 2005, Visual Studio Team System 2008, Visual Studio 2010 Ultimate,Visual Studio 2013一系列近5个版本的变化与亲…

PHP SSL certificate: unable to get local issuer certificate的解决办法

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 当本地curl需要访问https时&#xff0c;出现SSL certificate: unable to get local issuer certificate错误信息 解决办法&#xff1a; 到http://curl.haxx.se/ca/cacert.pem下载pem文件&#xff0c;并…

辞职前为什么挣扎_当您感到自己像开发人员一样挣扎时,为什么学得最多

辞职前为什么挣扎by Walt Schlender由Walt Schlender 当您感到自己像开发人员一样挣扎时&#xff0c;为什么学得最多 (Why you learn the most when you feel like you’re struggling as a developer) The times when I have made the greatest leaps in my development skil…

Hadoop学习之Mapreduce执行过程详解

一、MapReduce执行过程 MapReduce运行时&#xff0c;首先通过Map读取HDFS中的数据&#xff0c;然后经过拆分&#xff0c;将每个文件中的每行数据分拆成键值对&#xff0c;最后输出作为Reduce的输入&#xff0c;大体执行流程如下图所示&#xff1a; 整个流程图具体来说&#xff…

汇编试验十五:安装新的int 9中断例程

安装新的int 9中断例程&#xff08;按A键后显示满屏幕的A&#xff09; int 9 是外中断&#xff0c;同样&#xff0c;程序编写还是和其他中断例程类似&#xff0c;安装&#xff08;复制&#xff09;&#xff0c;调用&#xff1b; 不同点是在于&#xff0c;他要从端口读取数据60h…

php判断前端传的多个字段与数据库匹配

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 代码 <?phpheader("Content-Type:text/html;charsetutf8"); header("Access-Control-Allow-Origin: *"); //解决跨域header(Access-Control-Allow-Methods:POST);// 响应类型 …

javascript编写_用JavaScript深入探讨:为什么对编写好的代码至关重要。

javascript编写Using simple terminology and a real world example, this post explains what this is and why it is useful.这篇文章使用简单的术语和一个真实的例子&#xff0c;解释了this是什么以及为什么有用。 这是给你的吗 (Is this for you) I have noticed that man…

peak num

class Solution {public: int findPeakElement(vector<int>& nums) { int i0; int nnums.size(); while(i<n){ if(i0){ //处理第一位 if(nums[1] < nums[0]) return 0; else { …

用Eclipse的snippets功能实现代码重用

snippets功能实现代码重用 Snippets 代码片段是Eclipse的一个插件。 很多时候可以通过这个功能&#xff0c;重复使用常用的代码片段&#xff0c;加快开发效率。 创建一个代码段的步骤&#xff1a; 在Eclipse的editor中选中一块代码段&#xff0c;右键点击【Add to Snippets…

JS删除选中的数组

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 js // 删除数组deleteArr: function (e) {let middlearr [{a:1},{b:2}];//全部数组let items [{a:1}];//选中的数组for (var i 0; i < items.length; i) {for (var j 0; j < middlearr.lengt…

Git合并和变基简介:它们是什么,以及如何使用它们

by Vali Shah通过瓦利沙阿 Git合并和Git变基简介&#xff1a;它们做什么以及何时使用它们 (An Introduction to Git Merge and Git Rebase: What They Do and When to Use Them) As a Developer, many of us have to choose between Merge and Rebase. With all the reference…

[转]单点登录原理与简单实现

一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构&#xff0c;http作为通信协议。http是无状态协议&#xff0c;浏览器的每一次请求&#xff0c;服务器会独立处理&#xff0c;不与之前或之后的请求产生关联&#xff0c;这个过程用下图说明&#xff0c;三次…

[JAVA] DUMP

jmap -dump:live,formatb,fileD:\heap.bin 31563156是PID转载于:https://www.cnblogs.com/MasterMonkInTemple/p/4655547.html

ThinkPHP 5.0 入门教程 一:安装ThinkPHP并在Web浏览器访问

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 严格来说&#xff0c;ThinkPHP无需安装过程&#xff0c;这里所说的安装其实就是把ThinkPHP框架放入WEB运行环境&#xff08;前提是你的WEB运行环境已经OK&#xff09; 下面我们开始安装ThinkPHP的运行环…

以太坊区块链同步_以太坊69:如何在10分钟内建立完全同步的区块链节点

以太坊区块链同步by Lukas Lukac卢卡斯卢卡奇(Lukas Lukac) Ethereu M 69&#xff1a;如何在10分钟内建立完全同步的区块链节点 (Ethereum 69: how to set up a fully synced blockchain node in 10 mins) Welcome in the first article of our new go-ethereum series!欢迎来…

微信小程序客服实现自动回复图文消息链接,点击去关注公众号

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 用户打开客服消息&#xff0c;发送任意消息自动回复图文链接&#xff0c;达到关注公众号的目的。 先看效果&#xff1a; 打开芝麻小客服的后台&#xff0c;选择一键接入小程序智能客服 点击跳转 1.授权…

HtmlUnit、httpclient、jsoup爬取网页信息并解析

转载&#xff1a;http://tianxingzhe.blog.51cto.com/3390077/1755511转载于:https://www.cnblogs.com/puhongtao/p/7063563.html

《Maven 实战》笔记之setting.xml介绍

maven是什么&#xff1f;有什么用&#xff1f; Maven是一个跨平台的项目管理工具,主要服务于Java平台的项目构建,依赖管理和项目信息管理。项目构建包括创建项目框架、清理、编译、测试、到生成报告&#xff0c;再到打包和部署&#xff0c;项目信息包括项目描述,开发者列表,版本…

框架依赖注入和普通依赖注入_依赖注入快速入门:它是什么,以及何时使用它...

框架依赖注入和普通依赖注入by Bhavya Karia通过Bhavya Karia 介绍 (Introduction) In software engineering, dependency injection is a technique whereby one object (or static method) supplies the dependencies of another object. A dependency is an object that ca…

微信小程序自定义弹出框组件,模拟wx.showModal

微信小程序开发交流qq群 173683895 效果图&#xff1a; 代码 wxml <view wx:if{{showModal}}><view classmask_layer bindtapmodal_click_Hidden /><view classmodal_box><view class"title">取消订单</view><view classconte…

IOS tableView删除数据

NSMutableArray *_allshops; NSMutableArray *_deleteshops; -(IBAction)remove{ 1. //记录删除的行号 //创建动态数组存放行号的集合 NSMutableArray *deletepath [NSMutableArray array]; //遍历存放删除数据的数组&#xff0c;把行号放到deletepath中 for (Shop * s in _de…

vue.js 源代码学习笔记 ----- 工具方法 lang

/* flow */ // Object.freeze 使得这个对象不能增加属性, 修改属性, 这样就保证了这个对象在任何时候都是空的 export const emptyObject Object.freeze({}) /*** Check if a string starts with $ or _ ascii unicode 的区别 charcodeAt是一个字符的 unicode编码, 但是…

Tim Berners-Lee重新分散的新Web SOLID简介

by Arnav Bansal通过Arnav Bansal Tim Berners-Lee重新分散的新Web SOLID简介 (An introduction to SOLID, Tim Berners-Lee’s new, re-decentralized Web) Recently, Prof. Tim Berners-Lee lifted the veil off a project called Solid. I decided to check it out. In thi…

AngularJS2.0 教程系列(一)

Why Angular2 Angular1.x显然非常成功&#xff0c;那么&#xff0c;为什么要剧烈地转向Angular2&#xff1f; 性能的限制 AngularJS当初是提供给设计人员用来快速构建HTML表单的一个内部工具。随着时间的推移&#xff0c;各种特性 被加入进去以适应不同场景下的应用开发。然而由…

Vue组件绑定自定义事件

Vue组件使用v-on绑定自定义事件&#xff1a;   可以分为3步理解&#xff1a;     1.在组件模板中按照正常事件机制绑定事件&#xff1a;       template: <button v-on:click"increment">{{ counter }}</button>,       如上&#xff…

phpstudy本地调试运行TP5的后台源码

本地访问后台步骤&#xff1a; 1.打开 phpstudy 2.点击其它选项菜单 3.点击软件设置 4.点击端口常规设置 5.修改网站根目录为&#xff1a; C:\phpStudy\PHPTutorial\WWW\wxpet_2019\public phpstudy 切换php版本&#xff1a;5.6.27 public目录下的 .htacc…

如何使用TensorFlow Eager执行训练自己的FaceID ConvNet

by Thalles Silva由Thalles Silva Faces are everywhere — from photos and videos on social media websites, to consumer security applications like the iPhone Xs FaceID.人脸无处不在-从社交媒体网站上的照片和视频到iPhone Xs FaceID等消费者安全应用程序。 In this…

jquery判断一个元素是否为某元素的子元素

$(node).click(function(){if($(this).parents(.aa).length > 0){//是aa类下的子节点}else{//不是aa类下的子节点} });在判断点击body空白处隐藏弹出框时用到转载于:https://www.cnblogs.com/qdog/p/7067909.html

Sublime Text 3 (含:配置 C# 编译环境)

Sublime Text 3http://www.sublimetext.com/3http://www.sublimetext.com/3dev1. 关闭自动更新 菜单&#xff1a;Preferences->Settings User&#xff0c;打开User配置文档&#xff0c;在大括号内加入&#xff08;或更改&#xff09;&#xff1a; "update_check&q…

小程序仿安卓动画滑动效果滑动动画效果实现

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 效果图&#xff1a; 源码 var start_clientY; //记录当前滑动开始的值 var end_clientY; //记录当前滑动结束的值 var animation wx.createAnimation({duration: 400 }); //初始化动画var history_dis…