当前位置:首页 > 图片 > 国内图片 > 正文
文章正文

activiti 动态创建子流程 技术 | Activiti工作流之核心对象

图片 > 国内图片 > :activiti 动态创建子流程 技术 | Activiti工作流之核心对象是由美文导刊网(www.eorder.net.cn)为您精心收集,如果觉得好,请把这篇文章复制到您的博客或告诉您的朋友,以下是activiti 动态创建子流程 技术 | Activiti工作流之核心对象的正文:

技术 | Activiti工作流之核心对象

目前Activiti继承了Jbpm4的大部分功能,并上jbpm4上进行了部分的修改。具有简单快速的特点。它的核心对象包含以下几个主要的类。

1ProcessEngine

说明:

1) Activiti中最核心的类,其他的类都是由他而来。

2) 产生方式:

在前面看到了两种创建ProcessEngine(流程引擎)的方式,而这里要简化很多,调用ProcessEnginesgetDefaultProceeEngine方法时会自动加载classpath下名为activiti.cfg.xml文件。

3) 可以产生RepositoryService

4) 可以产生RuntimeService

5) 可以产生TaskService

各个Service的作用:

RepositoryService

管理流程定义

RuntimeService

执行管理,包括启动、推进、删除流程实例等操作

TaskService

任务管理

(activiti 动态创建子流程)

HistoryService

历史管理(执行完的数据的管理)(activiti 动态创建子流程)

IdentityService

组织机构管理

FormService

一个可选服务,任务表单管理

ManagerService

2RepositoryService

Activiti的仓库服务类。所谓的仓库指流程定义文档的两个文件:bpmn文件和流程图片。

1) 产生方式

2) 可以产生DeploymentBuilder,用来定义流程部署的相关参数

3) 删除流程定义

3:RuntimeService

activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行相关的信息。

4TaskService

activiti的任务服务类。可以从这个类中获取任务的信息。

5HistoryService

activiti的查询历史信息的类。在一个流程执行完成后,这个对象为我们提供查询历史信息。

6ProcessDefinition

流程定义类。可以从这里获得资源文件等。

7ProcessInstance

代表流程定义的执行实例。如范冰冰请了一天的假,她就必须发出一个流程实例的申请。一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。流程实例就表示一个流程从开始到结束的最大的流程分支,即一个流程中流程实例只有一个。(activiti 动态创建子流程)

8Execution

Activiti用这个对象去描述流程执行的每一个节点。在没有并发的情况下,Execution就是同ProcessInstance。流程按照流程定义的规则执行一次的过程,就可以表示执行对象Execution。

如图为ProcessInstance的源代码:

从源代码中可以看出ProcessInstance就是Execution。但在现实意义上有所区别:

在单线流程中,如上图的贷款流程,ProcessInstance与Execution是一致的。

这个例子有一个特点:wire money(汇钱)和archive(存档)是并发执行的。这个时候,总线路代表ProcessInstance,而分线路中每个活动代表Execution。

总结:

* 一个流程中,执行对象可以存在多个,但是流程实例只能有一个。

* 当流程按照规则只执行一次的时候,那么流程实例就是执行对象。

微官网:http://www.oraclewdp.com

实训咨询:010-52292270

咨询QQ:2845789564

版权所有:作者及甲骨文北京实训基地,转载必须告之

觉得不错,请点赞↓↓↓返回搜狐,查看更多

工作流引擎添新丁:Flowable6.0发布

如果你在还纠结该选择JPMB还是Acitiviti的时候,或者还在纠结于是否该从JPMB迁移到Activiti的阵营中的时候,很不幸地告诉你,Flowable6.0已经发布了。

是不是变得更纠结啦?!又多了一种选择。

1、 什么是Flowable?

如果你对工作流引擎有所了解,那么一定知道Java领域当前主流的工作流引擎无非就是Jboss旗下的JBPM和Alfresco旗下的Activiti。

Flowable是Activiti原班主创人员从Activiti分离出来的一套工作流引擎,是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎,易于与 Spring集成使用。

2、 Flowable6.0的由来?

故事还得从头说起。

依然是江湖流传已久的版本,大约在7年前,在JBPM4发布以后,JBPM的主创人员Tom Baeyens与合作伙伴在JBPM的未来架构上产生了重大分歧,于是Tom离开了Jboss并加入了Alfresco公司。紧接着,Alfresco公司就发布了Activiti5.0这款开源产品。Activiti团队直接将第一个版本定义为5.0,也是明示大家Acitiviti就是JBPM4的延续。而Tom的老东家Jboss则完全抛弃了JBPM4的架构,基于Drools Flow进行彻底重构,推出了JBPM5。

尽管JBPM5和Acitiviti5都支持BPMN2.0规范,但是由于JBPM5完全推翻了JBPM4的架构,这无异于将已经在使用JBPM4和之前版本的用户推向了Activiti5。因此几年下来,Acitiviti大有取代JBPM之势。当然,JBoss旗下有众多优秀的产品,JBPM5作为Jboss的亲生子,自然与这些产品进行整合具有先天的优势,因此选择Activiti5或JBPM5还需要认真权衡利弊。

说完Activiti的由来,不得不先感叹老祖宗的智慧:“话说天下大势,分久必合,合久必分”。

因为笔者在推特上关注了Tijs Rademarkers(原Activiti的Project Lead),前段时间当看到他两条连续的更新,9月份还在Activiti改bug,10月份居然发布Flowable上线声明,笔者浑身一颤,这明显是要搞事啊!

果不其然,打开Activiti官网发现已经改版了,团队成员的介绍也被替换了!

而新建的Flowable官网,成员介绍果然是那些熟悉的面孔,之前Activiti里的大咖们。

Flowable的诞生简直和Acitiviti的诞生如出一辙!当年JBMP的主创Tom已经离开Alfresco多年,后辈们也开始步前人后尘。Tijs Rademakers、Joram Barrez等Activiti的原班核心人马,由于与Alfresco公司在项目的未来发展方向上出现分歧,于是选择集体出走,创建了Flowable,并且将第一个版本定义为5.22,而且在两周前发布了6.0版本!要知道,Activiti当前版本依然还是5.22,6.0处于Beta阶段。

这下又给众多开发者布下了个不小的难题,是该紧跟Flowable的步伐,还是蹲守着Activiti?更不用说那些还在纠结于JBPM和Activiti之间的开发者了,这下又多了一个选择。

3、 Flowable6.1醒目的新特性

Flowable 5.22和6.0版本众多让人惊艳的新特性已经在官网详细地罗列,笔者在此就不再复述。Flowable项目组核心成员在Twitter上透露6.1版本的新特性至少包括以下几点,结合点融网自动审批系统底层工作流引擎的实践,这些新特性依然让人眼前一亮。

异步处理历史数据。当前版本处理历史数据与运行时数据处在同一个线程,大量使用案例表明,处理历史数据占用较长时间而用户不得不等待该线程事务的结束。改为异步处理后性能明显得到改善。

回退功能,运行通过API方式,让工作流当前状态回滚到之前的状态。

增加和拓展对事件子流程的支持

提高对事件监听器事务生命周期的支持

新增全局Counter功能

4、 那么Flowable能走多远?

越来越多的公司都意识到:创建一个软件项目最好的方式就是“开源”。

开源使得公司能够大大缩短开发时间,尤其能减轻打造一套通用系统底层架构上的压力,并且采取的是一套兼容性更强的技术标准。不少全球知名IT企业,都在将自己一些已经相当成熟的项目不断地开源出来。

可以说每一套软件系统的背后或多或少都有着开源的影子。

因为开源,任何人都可以参与进来,无论供职哪家公司,或者是自由职业者。然而开源也存在这样一个问题,开源能让每个人都自由地发挥聪明才智,但是它也并非想象中那样美好。毕竟我们处于一个商业的世界,那些背后支持着开源项目的大公司,在决定技术和项目的走向上总是拥有更大的话语权。

当一个开源项目的核心主创人员与开源项目背后的大公司发生技术和项目的走向分歧时,主创人员不得不另立山头,想要将自己的想法实现出来。但是同样危险的是,假如一个开源项目背后没有一个实力雄厚的公司支持下去,那么也许就会是一个有头无尾的开源项目。

而Flowable作为Activiti的一个分支,能走多远?或许也将受此因素影响。从Tijs Rademakers的LinkedIn上更新的简历来看,现在Flowable项目背后的靠山有可能是这家叫KIS Consultancy的公司。这家公司的主页简单到实在不能再简单了,Flowable的命运一时半会儿还真不好判断。

5、 开源分支的利弊?

在开源的世界里开辟分支是常见的。例如这篇文章May the Fork Be with You(http://thenewstack.io/may-fork-short-history-open-source-forks/)提到的一样,前段时间在Docker开源社区热议的一个话题:开辟Docker分支。

一些Docker生态系统的厂商和最终用户进行了一场从Docker分割出去的讨论。在表达各种对Docker公司在Docker Engine上管理的失望背后,这些技术专家和公司实际上是在探索如何解决在支持企业级的Dokcer部署中遇到的各种烦心问题。在诸多正在考虑的选项之中,包括可能会将整个开源的Docker Engine一起另起炉灶( fork )。

开辟分支有时是利于项目发展的。例如这篇文章Why you should fork your next open-source project(http://www.techrepublic.com/article/why-you-should-fork-your-next-open-source-project/),该文指出开辟分支往往是利于改革和创新的。

当然,不一定所有的开源分支最后都能成功。例如这篇文章Open Source Software and Forking: The Good, The Great and The Ugly(http://www.makeuseof.com/tag/forking-good-great-ugly/),通过对LibreOffice与MariaDB的比较、Node.js And与Forward的比较,以及对SystemD的案例分析,有较为详细的阐述,有兴趣的读者值得一看。

6、 Flowable团队是如何打消用户顾虑的

Flowable团队对用户说道,“如果你还在犹豫是否加入我们,请看看Activiti源码里的作者们,再看看Flowable项目的成员们。我们是最懂Activiti、在过去几年里推动了整个社区、为社区做出贡献和改革的那帮人。”

说了那么多,那么你会怎么选择呢?!

本文作者:黄斐(点融黑帮),任职于点融工程部Loan Business团队,致力于点融自动审批系统的底层流程引擎和监控服务系统的建设工作

本文由@点融黑帮(ID:DianrongMafia)原创发布于搜狐科技,未经许可,禁止转载。返回搜狐,查看更多


一.activiti怎么调用接口启动子流程

(activiti 动态创建子流程)

1. Activiti REST模块介绍
关于Rest的介绍就免除了,主要介绍一下Activiti Rest模块的功能以及如何使用。
1.1 使用REST的好处
简单化 :利用现有模块(activiti-rest.war)代替直接API调用
标准化 :各个系统根据rest模块的接口规范访问REST资源,统一处理;对于工作流平台来说此特性尤为突出
扩展性 :如果官方提供的REST接口还不能满足可以继续在其基础上进行扩展以满足业务系统(平台)的需求
1.2 不适合使用REST的场景
业务数据与流程数据分离: 就像kft-activiti-demo中 普通表单 的演示一样,业务数据保存在一张单独设计的表中,而不是把表单数据保存在引擎的变量表中,所以对于这样的场景中需要联合事务管理的就不能使用REST了,例如:启动流程、任务完成、业务与流程数据联合查询。
1.3 部署Rest模块
从 5.11 版本开始不再使用ant脚本的方式启动demo,并且把activiti-explorer和activiti-rest分离并分别提供一个war包,在 wars 目录可以找到它。
把activiti-rest.war解压到Web服务器的应用部署目录(例如tomcat的webapps),根据实际需求修改activiti-rest/WEB-INF/classes/db.properties里面的数据库配置后启动应用。
可以通过REST工具测试是否部署成功可以正常的提供服务,例如Chrome的插件REST Console ,或者通过Spring MVC提供的RestTemplate。
2. 访问REST资源
对于REST模块提供的接口可以参考用户手册的 REST API 章节,有着详细的介绍(包括URL和参数含义)。
2.1 身份认证
REST接口的大部分功能都需要验证,默认使用 Basic Access Authentication(基本连接认证) ,所以在访问资源时要在header中添加验证信息,当然为了安全期间把用户名和密码进行base 64位加密。
可以在用户登陆之后把用户名和密码进行加密并设置到session中,这样在前端就可以直接通过Ajax方式获取资源了:
import jodd.util.Base64;
String base64Code = "Basic " + Base64.encodeToString(user.getId() + ":" + user.getPassword());
session.setAttribute("BASE_64_CODE", base64Code);

2.2 通过Ajax方式读取资源
下面通过kft-activiti-demo中的代码片段介绍:
$.ajax({
type: "get",
url: REST_URL + 'process-definition/' + processDefinitionId + '/form',
beforeSend: function(xhr) {
xhr.setRequestHeader('Authorization', BASE_64_CODE);
},
dataType: 'html',
success: f......余下全文>>


二.Activiti流程控制,一个流程走完了,如何触发最后的事件。5分

在流程结束事件(endEvent)前添加一个j姬福灌凰弑好鬼瞳邯困ava service或web service任务,从前面流程中取参数,执行交付的业务流程


三.activiti怎么设置一下个节点的办理人??

流程节点上别指定具体人,使用${userId}变量的方式。
在上一节点的添加TaskListener,完成事件,对userId进行设置。
public class AssigneeSearch2 implements TaskListener {
public void notify(DelegateTask delegateTask) {
String userId = delegateTask.getVariable("applyUserId").toString();

if ("use缉碃光度叱道癸权含护r01".equalsIgnoreCase(userId) ) {
delegateTask.setVariable("userId", "leaderuser");
}
}
}
}



四.工作流activiti 怎么实现会签

Activiti中提供了多实例任务(for-each)将多实例应到到UserTask中可以实现会签功能。

一.多实例用户任务的XML表示:

Xml代码

<userTask id="task" name="多实例任务">

<multiInstanceLoopCharacteristics isSequential="false">

<loopDataInputRef>assigneeList</loopDataInputRef>

<inputDataItem name="assignee"></inputDataItem>

<!-- userIdList[user1,user2,user3] -->

<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6}</completionCondition>

</multiInstanceLoopCharacteristics>

</userTask>
<userTask id="task" name="多实例任务">
<multiInstanceLoopCharacteristics isSequential="false">
<loopDataInputRef>assigneeList</loopDataInputRef>
<inputDataItem name="assignee"></inputDataItem>
<!-- userIdList[user1,user2,user3] -->
<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>

在每个多实例创建后都会有3个变量

nrOfInstances 实例总数

nrOfActiveInstances 当前还没有完成的实例

nrOfCompleteInstances 已经完成的实例个数

multiInstanceLoopCharacteristics 是用了指定用户任务为多实例任务,isSequential
指定多实例是按照并行或者串行的方式进行,如果使用串行方式nrOfActiveInstances 变量始终是1.

loopDataInputRef
指定一个流程变量的引用,该变量是一个List,可以在发起或这执行任务之前作为流程变量放到引......余下全文>>


五.activiti怎么实现用户自定义流程

ProcessInstancepi=runtimeService.createProcessInstanceQuery()//.processInstanceId(processInstanceId)单敞厕缎丿等搽劝敞滑//使用流程实例ID查询.singleResult();if(pi==null){return"流程结束";}else{return"未结束";}



六.activiti启动流程实例表里会不会有任务

一个流程中,流程实例只有一个,执行对象可以有多个(如果存在分支和聚合)
SELECT * FROM activiti.act_ru_execution a; #正在执行的执行对象表

SELECT * FROM activiti.act_hi_procinst a; #流程实例的历史表

SELECT * FROM activiti.act_ru_task a; #正在执行的任务表(只有节点是User讥尝罐妒忒德闺泉酣沪Task的时候,该表中才存在数据)

SELECT * FROM activiti.act_hi_taskinst a; #任务历史表(只有节点是UserTask的时候,该表中才存在数据)

SELECT * FROM activiti.act_hi_actinst a; #所有节点的历史表


七.activiti5 怎样在流程图上圈出当前节点

ProcessDiagramGenerator.generateDiagram(pde, "png", getRun肠丹斑柑职纺办尸暴建timeService().getActiveActivityIds(processInstanceId));
参见该API,只是这个是通过流程配置文件动态生成的,而不是直接读取流程图图片


八.怎样使用activiti自己的API给流程定义添加描述

Activiti的流程定义文件可以直接发弗篡煌诂号磋铜单扩部署bpmn20.xml、zip、bar文件,其中后面的zip和bar类型一样都是压缩文件格式,bpmn20.xml是符合bpmn2.0规范的xml定义。

activiti 动态创建子流程 技术 | Activiti工作流之核心对象由美文导刊网(www.eorder.net.cn)收集整理,转载请注明出处!原文地址http://www.eorder.net.cn/pic55764/

文章评论
Copyright © 2006 - 2016 www.eorder.net.cn All Rights Reserved
美文导刊网 版权所有