activiti.cfg.xml配置 引擎配置在哪

如何实现Activiti的分支条件的自定义配置_百度知道
如何实现Activiti的分支条件的自定义配置
一、Activiti的流程分支条件的局限Activiti的流程分支条件目前是采用脚本判断方式,并且需要在流程定义中进行分支条件的设定,如下图所示:&sequenceFlow id=&flow2& sourceRef=&exclusiveGw& targetRef=&theTask1&&
&conditionExpression xsi:type=&tFormalExpression&&${input == 1}&/conditionExpression&&/sequenceFlow&&sequenceFlow id=&flow3& sourceRef=&exclusiveGw& targetRef=&theTask2&&
&conditionExpression xsi:type=&tFormalExpression&&${input == 2}&/conditionExpression&&/sequenceFlow&&sequenceFlow id=&flow4& sourceRef=&exclusiveGw& targetRef=&theTask3&&
&conditionExpression xsi:type=&tFormalExpression&&${input == 3}&/conditionExpression&&/sequenceFlow&从上面的定义可以看到,流程的分支条件存在以下两个致命的局限性:1.分支条件需要在流程定义(XML)中设定,这要求流程定义必须由开发人员来设计及编写2.分支条件比较简单,一般为boolean表达式,表达式里的为单变量的判断处理。以上两个局限性限制了流程的分支判断处理必须由开发人员来设定,而国内的大部分的流程应用都要求是普通的业务人员即可处理,或者是由有一定计算机基础的人员来设置处理。这要求我们对流程的条件设置提出了更高的要求,上一节我们通过修改Activiti的流程定义的XML中的分支条件表达式,同时刷新流程定义的引擎缓存,如下的代码就是基于这种方式:JsonNode jsonObject=objectMapper.readTree(configJson);
JsonNode configsNode=jsonObject.get(&configs&);
BpmSolution bpmSolution=bpmSolutionManager.get(solId);
BpmDef bpmDef=bpmDefManager.getLatestBpmByKey(bpmSolution.getDefKey(), ContextUtil.getCurrentTenantId());
ActProcessDef processDef=actRepService.getProcessDef(bpmDef.getActDefId());
String processDefXml=actRepService.getBpmnXmlByDeployId(bpmDef.getActDepId());
System.out.println(&xml:&+processDefXml);
ActNodeDef sourceNode=processDef.getNodesMap().get(nodeId);
ByteArrayInputStream is=new ByteArrayInputStream(processDefXml.getBytes());
Map&String,String& map = new HashMap&String,String&();
map.put(&bpm&,&&);
map.put(&xsi&,&&);
SAXReader saxReader = new SAXReader();
saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
Document doc = saxReader.read(is);
//Document doc=Dom4jUtil.load(is, &UTF-8&);
Element rootEl=doc.getRootElement();
if(configsNode!=null){
//取得分支条件列表
JsonNode configs=configsNode.get(&conditions&);
if(configs!=null){
Iterator&JsonNode& it=configs.elements();
while(it.hasNext()){
ObjectNode config=(ObjectNode)it.next();
String tmpNodeId=config.get(&nodeId&).textValue();
String tmpCondition=config.get(&condition&).textValue();
Element seqFlow=(Element)rootEl.selectSingleNode(&/bpm:definitions/bpm:process/bpm:sequenceFlow[@sourceRef='&
+sourceNode.getNodeId()+&' and @targetRef='&+tmpNodeId+&']&);
if(seqFlow==null)
Element conditionExpress=(Element)seqFlow.selectSingleNode(&bpm:conditionExpression&);
if(conditionExpress==null){
conditionExpress=seqFlow.addElement(&conditionExpression&);
conditionExpress.addAttribute(&xsi:type&, &tFormalExpression&);
conditionExpress.clearContent();
conditionExpress.addCDATA(tmpCondition);
//修改流程定义的XML,并且清空该流程定义的缓存
actRepService.doModifyXmlAndClearCache(bpmDef.getActDefId(),bpmDef.getActDepId(), doc.asXML());【说明】1.基于这种方式容易出错,因为流程的分支条件写回流程定义的XML是比较容易出问题的,同时不清楚人员填写什么条件回XML文件中。2.对于Jsaas中的一个流程定义可用于多个流程解决方案中使用配置不同的条件不太适合,因为一个流程定义是一样,但可能会分支的条件设置不一样。基于以上的要求,为此我们对Activiti进行扩展,以使得我们可以允许流程引擎在分支判断处理中,执行我们的条件设置,其原理如下:当流程引擎跳至分支条件判断处理时,可以让它执行我们的脚本设置条件,条件满足时,则跳至我们的设置的目标节点,从而实现干预流程引擎本身的执行方式,为了不影响Activiti的原的运行机制,我们还是保留其旧的执行判断方式。二、Activiti的扩展点Activiti的流程扩展是比较灵活的,我们通过改写这个ExclusiveGateway的节点的行为方法即可,其实现方法如下:package com.redxun.bpm.activiti.import java.util.Iimport javax.annotation.Rimport org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBimport org.activiti.engine.impl.pvm.PvmTimport org.activiti.engine.impl.pvm.delegate.ActivityEimport mons.lang.StringUimport org.slf4j.Limport org.slf4j.LoggerFimport com.redxun.bpm.core.entity.config.ExclusiveGatewayCimport com.redxun.bpm.core.entity.config.NodeExecuteSimport com.redxun.bpm.core.manager.BpmNodeSetMimport com.redxun.core.script.GroovyEimport com.sun.star.uno.RuntimeE/** * 对网关的条件判断,优先使用扩展的配置 * @author keitch * */@SuppressWarnings(&serial&)public class ExclusiveGatewayActivityBehaviorExt extends ExclusiveGatewayActivityBehavior{
protected static Logger log = LoggerFactory.getLogger(ExclusiveGatewayActivityBehaviorExt.class);
//节点的设置管理器
BpmNodeSetManager bpmNodeSetM
//脚本引擎
@Resource GroovyEngine groovyE
protected void leave(ActivityExecution execution) {
log.debug(&enter ExclusiveGatewayActivityBehaviorExt=======================&);
if (log.isDebugEnabled()) {
log.debug(&Leaving activity '{}'&, execution.getActivity().getId());
String solId=(String)execution.getVariable(&solId&);
String nodeId=execution.getActivity().getId();
log.debug(&solid is {} and nodeId is {}&,solId,nodeId);
if(StringUtils.isNotEmpty(solId)&& StringUtils.isNotBlank(nodeId)){
ExclusiveGatewayConfig configs=bpmNodeSetManager.getExclusiveGatewayConfig(solId, nodeId);
for(NodeExecuteScript script:configs.getConditions()){
String destNodeId=script.getNodeId();
String condition=script.getCondition();
log.debug(&dest node:{}, condition is {}&,destNodeId,condition);
//执行脚本引擎
Object boolVal=groovyEngine.executeScripts(condition, execution.getVariables());
if(boolVal instanceof Boolean){
Boolean returnVal=(Boolean)boolV//符合条件
if(returnVal==true){
//找到符合条件的目标节点并且进行跳转
Iterator&PvmTransition& transitionIterator = execution.getActivity().getOutgoingTransitions().iterator();
while (transitionIterator.hasNext()) {
PvmTransition seqFlow = transitionIterator.next();
if(destNodeId.equals(seqFlow.getDestination().getId())){
execution.take(seqFlow);
throw new RuntimeException(&表达式:\n &+condition+&\n返回值不为布尔值(true or false)&);
//执行父类的写法,以使其还是可以支持旧式的在跳出线上写条件的做法
super.leave(execution);
}}我们通过继续改写了这个分支节点的跳出机制,并且通过脚本引擎来执行其条件分支的判断处理,但流程引擎并不了解我们扩展的类,这时我们需要配置Activiti流程引擎的行为动作工厂类,如下所示:package com.redxun.bpm.activiti.import org.activiti.bpmn.model.ExclusiveGimport org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBimport org.activiti.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorF/** * 扩展缺省的流程节点默认工厂类,实现对Activiti节点的执行的默认行为的更改 * @author keitch * */public class ActivityBehaviorFactoryExt extends DefaultActivityBehaviorFactory {
private ExclusiveGatewayActivityBehaviorExt exclusiveGatewayActivityBehaviorE
* 通过Spring容器注入新的分支条件行为执行类
* @param exclusiveGatewayActivityBehaviorExt
public void setExclusiveGatewayActivityBehaviorExt(ExclusiveGatewayActivityBehaviorExt exclusiveGatewayActivityBehaviorExt) {
this.exclusiveGatewayActivityBehaviorExt = exclusiveGatewayActivityBehaviorE
//重写父类中的分支条件行为执行类
public ExclusiveGatewayActivityBehavior createExclusiveGatewayActivityBehavior(ExclusiveGateway exclusiveGateway) {
return exclusiveGatewayActivityBehaviorE
自动化开发工程师
为您推荐:
activiti的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁什么情况下,需要使用工作流引擎?
目前在做一个文档管理系统,主要的业务如下:上传报告--&合法性验证--&审核评估--&系统评分--&评价报告--&认证--&发布。这个系统需要使用工作流引擎吗?
按投票排序
有“业务流转”流程化的场景,都可以使用工作流。您提的这个适用。常用的情况比如OA中的公文和事务处理、系统运维的故障处理流程等
其实说是工作流,无外乎只是把整个流程中不同的操作或者说不同的步骤以某种方式衔接起来。只是我觉得工作流最大的好处是 系统自动流转。拿上面的文档管理系统来说系统可以自动按照设定的步骤流转,如果系统可以处理的,自动处理掉,如果系统不可以处理那用某种方式通知需要处理的人,让人介入,而不需要人主动去关注现在应该做哪个步骤
使用工作流的好处是,高可维护性以及扩展性。如果你这个系统中只用到了这一个流程,且变动的可能性不大,基本不需要考虑工作流。但是如果不是上述情况的话,还是用吧。。。个人只接触过Activiti ,神马jbpm4 jbpm5之类的还真没用过。。。不过看你这个,就算用的话,开发成本也不是很高。。。
工作流软件,办公文档的流转,经常被誉为无纸办公的一部分。例如,以往工作中纸质的请假,审批条,通过电子文稿的方式在员工之间流转,从而提高办公效率。由于每个公司工作流程不一样,Saas可定制化的流程,产品结构上可以分为传统的部署型工作流和基于云计算的在线工作流产品。从性价比的考虑,可以选择在线可定制模式,例如咱们Gleasy中由第三方开发工作流软件,企业月租费仅需90元/月/企业,无其他费用。当然,工作软件是辅助提高公司管理水平的工具,而管理意识、能力与水平的提升也是很重要的。
“工作流”到处都在,一个人独自干活也有工作流,一般不需要什么“引擎”。 讲究点的装个To Do在手机上。如果是小型创业公司,十几个人,工作流简单,也没必要上专门的软件,收益和成本相比不合算。如果是较大的公司,流程设计部门多,发觉效率低了,或管理失控了,就有必要制定严密的工作流程,然后用合适的软件系统来运作这个流程。介绍几个系统供参考:IBM的Lotus Domino/Notes是当前比较好的工作流软件系统,在欧美企业用的相当多。成本相对低,上线也快。扩展性极强,小公司用1台服务器,随着业务扩展,可以增加服务器,我公司已经在全球有200多台Domino服务器了。微软的Exchange也有工作流功能,但是基本没人用。也有某些公司开发的Web+SQL的工作流,尤其很多政府在用,界面花哨,看似强大,其实扩展性和维护性很差。另:光靠软件是不行的,管理一定要跟上,不然最先进的软件硬件也没用。
可联系我,负责G2工作流引擎,基于sharepoint平台。
已有帐号?
无法登录?
社交帐号登录18535人阅读
【Java详解】(28)
& & & &有一段时间没有更新文章了,虽然有一直在写文章,可是一直没有更新到博客内,这段时间写的文章大多还是以技术为主。接下来的系列文章将会来讨论企业工作流的开发,主要是来研究开源工作流Activiti的使用。
& & & &该篇文章来详细了解下Activiti 5.15的安装配置全过程,其实安装的过程相当的简单,因为随着Activiti的版本升级安装就变得简单了很多,但是它的配置方法没有想象的那么简单,在配置时需要注意很多问题,这里就来详细的了解下Activiti 5.15的配置全过程。
& & & &Note:文章都是读者经过实践后总结的安装方法,可能不适用于所有的电脑,有问题的话可以留言讨论学习。
一、Activiti下载及简介
& 1.1、Activiti下载
& & & &官网下载地址:
& & & &Note:下载时不一定要使用最新版本的,最新版本会欠缺中文资料在使用时会稍微繁琐点,所以提倡下载稍稳定点的或者距最新版本较近的版本。
& 1.2、Activiti
& & & & 解压下载的Activiti包会得到下面的文档内容,其中最主要的是libs和wars,具体如下图:
& & 1.2.1 database
& & & & &该文件夹内放置了Activiti示例的所有数据库脚本,脚本包含了mssql、mysql、h2的数据库,分别封装了数据库表的创建和数据的写入、数据库表的修改及删除脚本,功能齐全。
& & 1.2.2 docs
& & & & &Activiti的使用帮助文档,分别包含了javadoc的Api、用户使用手册、xml scheme
& & 1.2.3 libs
& & & & 放置的是开发的指针库,每个jar文件代表开发时的一个引用项,具体每个jar的使用操作说用,可以查看目录中的notice文档。
& & 1.2.4 wars
& & & & &该文件夹相当的重要,文件夹中有两个文件activiti-explorer.war和activiti-rest.war,分别代表了流程的浏览器框架和流程的启动引擎,在开发时需要将它们部署到tomcat的webapps文件夹中,在启动流程时会自动调用这两个文件。
& & & & &activiti-explorer.war,浏览器框架,框架中包含了流程节点的查看、审批、流转等基本的操作,在打开该框架时初始化用户为如下表:
& & & & &activiti-rest.war,流程引擎,流程真正的处理过程是在引擎中实现的,它封装了流程的处理过程。
二、安装配置详解
& & & &虽然Activiti的下载很简单,但是它的安装配置的却相当的繁琐,因为它的依赖项比较多。首先Activiti在运行时需要一个Servlet服务器作为容器来提供Activiti-explorer.war框架的运行,所以需要配置一个Java的服务器,这里使用Apache-tomcat作为安装项;其次需要配置Java的运行环境,它是Activiti在安装Demo时所必须的运行环境,所以需要安装j2ee及配置环境变量JAVA_HOME。
& & & &&Note:安装J2ee前首先需要安装j2se,一定要注意J2se的版本一定要和J2EE的版本一致,另外也需要注意Java环境的版本要和tomcat的版本一致,即下载安装的位数一定要一致,如果是32位则都需要下载和安装32位的版本,否则在安装Activiti时会出错。
& &2.1、Apache-tomcat安装
& & & & tomcat的下载地址:http://tomcat.apache.org/download-70.cgi
& & & & Advice:这里提倡使用6.0版本的tomcat,因为它的稳定性较高,并且兼容性好。
& & &下载完成后需要配置环境变量,设置安装的二进制文件夹binery的目录,如下步骤:
& & & 2.1.1 添加tomcat的系统变量CATALINA_HOME
& & & & 将下载的tomcat解压,然后创建系统变量CATALINA_HOME,该系统变量指定了tomcat的binery所在文件夹的父目录(tomcat的目录),在运行tomcat时会自动查找该目录并启动,如下图:
& & & &2.1.2 添加系统变量Path路径
& & & & 添加tomcat的binery所在的目录,在path中可以使用系统变量的方法%CATALINA_HOME%\bin\或者也可以使用完整的安装路径来代替系统变量的方法来设置变量的安装路径。
& & & & 至此tomcat配置完成,接下来就是安装java的运行环境了。
& 2.2、J2EE安装及配置
& & & & &j2ee的安装会相较简单些,学过java的开发人员都知道在开发时首先需要安装初级版本j2se,然后才能安装j2ee,它们两种的开发应用有较大的区别。
& & & & J2SE的安装和配置和原始的安装配置一致,在安装后配置相应的JAVA_HOME变量和Path路径即可,安装完成后验证功能即可。
三、Activiti安装
& &3.1、框架及引擎安装
& & & & 上面的步骤配置好后接下来将Activiti的wars文件夹中的activiti-explorer.war和activiti-rest.war复制到tomcat的webapps文件夹内,然后活动运行startup.bat文件启动tomcat,等待安装完成。在此过程中会检测系统并安装H2内存数据库,并安装相应的Demo模型。
& & & & 安装完成后打开网址http://localhost:8080/activiti-explorer,使用kermit用户登录,看到下图代表安装成功:
& 3.2、在Eclipse中安装
& & & & 经过上步骤后证明Activiti的框架已经搭建完成,但是想要使用试图设计器的话需要在Eclipse中安装Activiti的设计插件,具体的配置安装方法如下:
& & &&3.2.1 打开安装界面
& & & & 依次打开Help--&Install New Software,如下图:
& & & 3.2.2 安装
& & & & 打开安装界面后在输入网址的地方输入http://activiti.org/designer/update/ 网址,然后选择第一个选项安装相应的设计器插件。
& & & &经过上面的步骤后,Activiti的安装和配置过程已经完成,
& & & 接下来就可以根据Api文档来开发相应的流程,这里提供一个5.15翻译版本的用户手册:http://download.csdn.net/detail/zhang_xinxiu/7697351,需要时下载即可。
& & & & 在纠结了有一周的时间后终于把Activiti的开发环境配置完全了,其实很多事情往往困难的是开始的时候,因为毫无头绪,没有正确的方向,所以只能一点点的摸索,但是这个过程是相当锻炼人的,经历过了就会有很大的提升,另外在这个过程中还要有细心,记录经过的步骤,在完成后回头思考自己所经历的步骤,最后思考总结,保证遇到同样的问题后能够快速的解决。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:627953次
积分:8325
积分:8325
排名:第1519名
原创:139篇
评论:1642条
阅读:35008
阅读:14316
文章:15篇
阅读:66586
(1)(3)(1)(1)(1)(2)(2)(1)(1)(1)(9)(20)(4)(4)(4)(5)(6)(8)(4)(6)(4)(4)(4)(4)(4)(5)(7)(5)(2)(1)(6)(6)(4)&&原精关于自学activiti开源流程引擎的一点点感悟和代码分享demo教程这应该是离开上一家公司留下的精华,废话不多说,上图上代码:环境配置:eclipse+mysql+activiti+struts2+spring+mybatis+ligerui.struts2、spring零配置,全注解实现。我相信这个项目相对于有2~3年的程序猿有很大的帮助.初始化数据库,新建一个activiti-demo的数据库。初始化项目中的初始化脚本,在web-initscript里面的sql文件全部初始化。注意不能用mysql-fornt工具初始化,最好用HeidiSQL工具初始化脚本。启动eclipse导入项目,修改项目根目录下的jdbc.properties文件,URL换成自己的数据库的连接url,修改为自己的用户名、密码等等。配置tomcat服务器,运行项目。打开浏览器,登录-发布流程。数据库定义了三个用户:zhangsan & 123sa & & & & & & & &123admin & & & & 123如图:&发布流程后就可以进行activiti流程引擎之旅。(流程文件在initscript中的xml)用zhangsan登录-提交请假申请。如图:sa登录-查看个人代办,可以看到zhangsan提交的申请,可以对记录进行审批或者查看流程图。如图:sa通过后流程会流向admin,如果不同意会流向zhangsan,此时zhangsan代办可以看到自己提交的记录,这是不合理的,因为我是做个自己预研的demo,所以这个没有处理,如果是等待zhangsan审批,zhangsan是可以对记录进行修改,然后提交,继续走流程。本人觉得代码注释还是可以滴。详见压缩包文件。高手请勿喷。纯属个人对技术的热爱。我的博客地址:由编辑于 9:25:2613个牛币请下载代码后再发表评论//HeidiSQL_8.0_Setup.exe/activiti-demo.rar精精精原原精原精原精原原原原精最热搜索分享话题编程语言基础Web开发数据库开发客户端开发脚本工具游戏开发服务器软硬件开源组件类库相关分享原精原最近下载暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级最近浏览暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友

我要回帖

更多关于 activiti引擎 的文章

 

随机推荐