(注: 为了证实方便, 已经简化和改进相关手续, 和点融实操不相通卡塔尔(قطر‎

3.配置

图片 1

5.3 运行中(ProcessInstance)

简言之正是未有甘休的流水生产线,全体到场过的人都应该可以见到那么些实例,可是Activiti的API未有能够通过客商查询的方法,那几个只可以协和用hack的法子管理了,笔者眼下还从未管理。

从表ACT_RU_EXECUTION中查询数据。

对应的API查询:

?

1
2
3
4
5
6
7
8
9
10
/**
 *
获取未经完成的流程实例查询对象
 *
@param userId    用户ID
 */
@Transactional(readOnly
=
true)
public
ProcessInstanceQuery createUnFinishedProcessInstanceQuery(String userId) {
    ProcessInstanceQuery
unfinishedQuery = runtimeService.createProcessInstanceQuery().processDefinitionKey(getProcessDefKey())
            .active();
    return
unfinishedQuery;
}

图片 2

2.2.1 引擎提供的Form

概念表单的不二秘技在各样Task标签中定义extensionElementsactiviti:formProperty就可以,到达那些节点的时候能够透过API读取表单成分。

Activiti官方的例子使用的正是在流程定义中设置每三个节点彰显怎么的表单哪些字段须求体现、哪些字段只读、哪些字段必填。

唯独这种办法只有适用于比较容易的流水生产线,对于有个别复杂也许页面需求职业逻辑的决断的情状就不适用了。

对于数据的保存都以在蒸内燃机的表中,不便于和别的表的涉嫌、对任何系统的安插性也不利!

一个好的设计不是一步到位的宏图,
而是贰个渐进的进度甚至不断重构的进程.
但是丰硕关键的有些正是在生龙活虎上马可以依照当下的供给以致所能预言的要求开展规划,
何况在此个底蕴框架代码上付出要进一层方便和简洁.

4.运用单元测量试验

单元测验均使用Spring的AbstractTransactionalJUnit4SpringContextTests作为SuperClass,而且在测量检验类增添:

?

1
2
@ContextConfiguration(locations
= {
"/applicationContext-test.xml"
})
@RunWith(SpringJUnit4ClassRunner.class)

即使Activiti也提供了测量检验的片段超类,可是认为不好用,所以自身包装了部分措施。

代码请转移:

别人的系统是什么样完结的?

2.2.2 自定义业务Form

这种办法应该是大家用的最多的了,因为日常的事情种类业务逻辑都会相比复杂,並且数据库中好些个表都会有依赖关系,表单中有超多景色推断。

比如说我们的连串适用jQuery
UI作为UI,有多数javascript代码,页面包车型客车累累操作须求非常管理(比如:多少个采纳的排斥、每个节点遵照项目和操作人展现不相同的开关);基本各个集团都有豆蔻梢头套自身的UI风格,要保全八个系统的操作习贯意气风发致只好利用自定义表单技能满足。

◆✦以下对第二、三点实行进行✦◆

2.4 同步客户数量

其生机勃勃主题材料也是非常多的人询问过,Activiti帮助对职务分配到:钦点人、钦定组、两个结合,而那一个人和组的音讯都保存在ACT_ID..表中,有友好的顾客和组(剧中人物卡塔尔(قطر‎处理让广大人心慌了;原因是因为各类系统都会设有叁个权力管理模块(维护:客商、部门、剧中人物、授权),不精通该怎么和Activiti同步。

➤ WorkflowService对专业流引擎的包裹

5.2 办理中(Task)

此类职务数据类源有二种:

  • 签收后的,5.1中签收后就应当为办理中状态

  • 节点钦命的是切实到一人,并不是角色

对应的API查询:

?

1
2
3
4
5
6
7
8
9
/**
 *
获取正在处理的任务查询对象
 *
@param userId    用户ID
 */
@Transactional(readOnly
=
true)
public
TaskQuery createTodoTaskQuery(String userId) {
    TaskQuery
taskAssigneeQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey()).taskAssignee(userId);
    return
taskAssigneeQuery;
}

☞ 底子框架代码的宏图

4.1 验证流程图设计是还是不是科学

代码请转移:

❸ 借款人确认, 通过客服服务人士上传具名照片

10. 任务代办

众多人问“Owner”属性为啥是空的,哪天用?要打听它的效能首先要询问“代办”。

代办的定义能够用下面包车型地铁一句话总结:

你领导接到一个任务,让你代办,你办理完成后任务还是回归到你的领导,事情是你做的,功劳是你领导的,此乃代办也!

阅览那些单元测量试验你就知晓什么是代办:ProcessTestDelegateTask

最好把activiti-study以此类型下载下来导入到Eclipse中运营一下:

原创随笔,转发请表明:转载自:专门的工作流引擎Activiti使用总括

➤ 前段时间, 其它叁个门类其利用到的场景和那个体系有相似之处,
其独自于该业务管理平台. 在这里种场馆下, 将该工作流相关的模块进行公共化,
以JASportage包的款式提供, 使得其余三个连串的支付能够短时间内到达相通的遵守

6.2 流程状态

图片 3

网编:

2.5 流程图设计工具用什么样

Activiti提供了三个流程设计工具,然则面向对象分歧。

  • Activiti
    Modeler,面向业务职员,使用开源的BPMN设计工具Signavio,使用BPMN描述业务流程图

  • Eclipse
    Designer,面向开发人士,Eclipse的插件,能够让开发职员定制每种节点的属性(ID、Name、Listener、Attr等)

图片 4

5.5 查询时和业务涉嫌

提示:此前在作业对象增添了PROCESS_INSTANCE_ID字段

思路:今后得以行使这些字段查询了,不管是Task依然ProcessInstance都得以拿走流程实例ID,能够依靠流程实例ID查询实体然后把流程对象设置到实体的叁脾本性中由Action可能Controller输出到前台。

代码请参见:

图片 5回来和讯,查看越多

2.1.2 使用压缩包格局布署

Activiti扶植计划*.bpmn20.xml、bar、zip格式的流程定义。

接纳Activit Deisigner工具设计流程图的时候会有四个体系的文件:

  • .activiti设计工具使用的公文

  • .bpmn20.xml兼备工具自动根据.activiti文件生成的xml文件

  • .png流程图图片

解决办法便是把xml文件和图表文件同有的时候间安顿,因为在单独安顿xml文件的时候Activiti会自动生成一张流程图的图样文件,然而如此在动用的时候坐标和图表对应不起来……

为此把xml和图表同一时候布署的时候Activiti自动关联xml和图表,当必要得到图片的时候一直回到安排时压缩包里面包车型大巴图片文件,并不是Activiti自动生成的图纸文件

在凉台的莫过于运维中, 有美妙绝伦的作业要求管理, 包罗借款人, 出借人,
资金等等, 同期还波及到种种差异的业务部门,
并且流程的流转操作职员和机构也搭乘飞机企务的前行而各异的调解.
设计二个底子的流程框架和落到实处底蕴代码, 产生不难的支付情势是该体系的要紧.
因而整个系统的规划涉及到以下重视多少个地点:

1.2 Activiti与JBPM5?

对于Activiti、jBPM4、jBPM5大家应当如何筛选,在InfoQ上有大器晚成篇文章写的很好,从大的局直面比各种引擎之间的间距,请参考作品:纵观jBPM:从jBPM3到jBPM5以及Activiti5

如此可能那样的狐疑或然不着疼热争,

2.5.1 大家的情势

莫不你会惊讶,因为大家未有应用Activiti
Modeler,大家以为用Viso已经能发布流程图的意味了,何况项目主任也是本事出身,和开辟职员也便于沟通。

时下以此体系是首先个使用Activiti的,起头大家在必要实验商量阶段选拔Viso设计流程图,利用泳道流程图规划和客商联系,鲜明后由肩负流程的开垦人士用Eclipse
Designer设计赢得bpmn20.xml,最终安插。

原标题:基于工作流的阳台管理类别规划

1.轻松介工作流引擎与Activiti

对于工作流引擎的解说请参谋百度完备:办事流引擎

下图为基本的结构划设想计

6.3.1 当前节点定位JS

Java代码请移步:

Javascript思路:先通过Ajax获取当前节点的坐标,在钦定地点添加葱青边框,然后加载图片。

代码移步:

❶ 借款人联系客性格很顽强在艰难险阻或巨大压力面前不屈职员, 提交申请

6.UI及截图

结合实际业务描述贰个事务从初步到竣事的经过,对于迷惑的同窗看完柳暗花明了;这里运用请假作为例子。

为了解决#1的难题,
则要求定义出流程–步骤—业务(诉求类型卡塔尔国—管理人/组 的安排 关系,
并在流程流转时自动安装, 并不是在工艺流程描述文件 (bpmn卡塔尔国里 内定

7.开启Logger

  1. 添加log4j的jar
  2. 设置log4j.logger.java.sql=DEBUG

图片 6

2.1.2.2 使用Ant脚本打包Zip文件

那也是大家选用的艺术,你可以手动选项xml和png打包成zip格式的文本,也得以像大家朝气蓬勃致选拔ant
target的形式打包那三个文件。

123456789101112
<?xml version="1.0" encoding="UTF-8"?><project name="foo">     <property name="workflow.definition" value="foo-common-core/src/main/resources/diagrams" />    <property name="workflow.deployments" value="foo-common-core/src/main/resources/deployments" /> <target name="workflow.package.oa.leave">     <echo>打包流程定义及流程图::OA-请假</echo>        <zip destfile="${workflow.deployments}/oa/leave.zip" basedir="${workflow.definition}/oa/leave" update="true"            includes="*.xml,*.png" /> </target></project>

view
rawbuild.xml hosted
with ❤ by GitHub

如此那般当改进流程定义文件后只要运转ant命令就能够打包了:

ant workflow.package.oa.leave

今后结构bar或许zip文件查看流程图图片就不是乱码了,而是你的压缩包里面包车型大巴png文件。

对此一个近乎涉及到审查批准以致实行实务的系统, 基于简单的情事调整的两全,
可能机关开采类职业流引擎轮子的做法都是不合适.
所以一个开源而且被广大应用的做事流引擎是一个确实无疑何况必得的选用. Activiti
专业流引擎由于其轻量级, 易用性等优点目前在业界被周边使用.
其职业流的状态机和表面系统的连接只必要通过二个ID实行关联就能够,
即activiti的business key. (如下图卡塔尔

2.3 业务和流程的涉及形式

以此标题在群里面超多个人都问过,那也是本身刚刚起头吸引之处;

新兴看了以下API发掘RuntimeService有四个情势:

二. 提前还款流程

2.初次使用遭逢难点收罗

因为Activiti刚刚退出不久所以资料比较空缺,中文资料越来越少的可怜,所以开头的时候糊里糊涂(固然事情发生前用过职业流,可是感到间距超级多),并且官方的手册还不是很完善;所以自个儿把本人在上学应用的长河蒙受的朝气蓬勃部分疑点都位列出来分享给大家;以下几点是本身遭遇和想到的,如若您还应该有何样疑难能够在评价花月本人调换再补充。

❸ 运转搭乘飞机构实行改善操

1.1 作者与职业流引擎

在首家厂商办事的时候根本任务正是开拓OA系统,当然基本都以有职业流的支撑,不过当下利用的劳作流引擎是商铺部分牛人开荒的(听闻是用二个开源的内燃机校正的),名称为CoreFlow;功用相对Activiti来讲相比较弱,不过能满足平常的利用,当然也是有过多的难点因而后来大家只能更正引擎的代码打补丁。

今昔是自个儿职业的第二家同盟社,因为要开拓ERP、OA等系统须要动用职业流,在品种调研阶段自个儿先找找资料选取采纳哪个开源办事流引擎,最后分明了Activiti5并依据厂商的布局做了部分DEMO。

正如上边曾说起, 对于两个系统规划, 不容许一步到位,
在中期时要抓住最须求消释的标题, 例如在此个系统早先阶段,
最基本的设计包括:

4.2 业务对象和流程关联测量检验

代码请转移:

❺ 生成还款结清申明

2.3.2 startProcessInstanceById

javadoc对其证实:

startProcessInstanceById(String processDefinitionId, String businessKey, Map variables) 
          Starts a new process instance in the exactly specified version of the process definition with the given id.

processDefinitionId:那一个参数的值能够因此repositoryService.createProcessDefinitionQuery()方法查询,对应数据库:ACT_RE_PROCDEF;每一回布署二回流程定义就能增添一条数据,同名的本子号增多。

专程表明: 此能够内定不一样版本的流水生产线定义,让顾客多豆蔻梢头层选用。

公共化专门的学业流模块:

3.1 集成Spring

对此和Spring的集成Activiti做的正确性,简单布署部分Bean代理就可以兑现,可是有四个和业务相关的地点要晋升:

  • 配置processEngineConfiguration的时候属性transactionManager要动用和事务职能的同一个事务管理Bean,不然事务不一齐。

  • 对此落成了org.activiti.engine.delegate包中的接口的类须要被职业调节的落成类必要被Spring代理,并且增进事务的Annotation或然在xml中布署,比方:

?

1
2
3
4
5
6
7
8
9
10
/**
 *
创建缴费流程的时候自动创建实体
 *
 *
@author HenryYan
 */
@Service
@Transactional
public
class

CreatePaymentProcessListener
implements
ExecutionListener {
   ....
}

Property表里是还是不是需求须求用差别的字段(LONG_VALUE,
TEXT_VALUE, DOUBLE_VALUE等卡塔尔国存分化类型的值;仍然直接都存成字符串,
在代码中再依靠须要转成Long, Double等?当然两种完毕都以实用的,
並且有利有弊,
何况个人认为存在差别的字段上亮点越来越大学一年级部分(主要反映在询问效用卡塔尔(قطر‎,
可是怎样进一层的让投机信性格很顽强在暗礁险滩或巨大压力面前不屈?
在看activiti的文书档案时意识外界的事务数据以Map的点子存在activiti的数据库中,
那么activiti的设计者同样会境遇相仿的题材.
通过查看源代码以致其数据库设计, 开采其将数据存入不一样的字段.
可是在小编的计划中, 作者并未完全照搬Activiti的管理格局, 比如:
小编从未为布尔类型加单独的字段,
而是以0恐怕1的格局存入LONG_VALUE里。

2.1.2.1 使用工具打包Bar文件

在“Package Explorer”视图中右键项目名称然后点击“Create deployment
artifacts”,会在src目录中创建deployment文本夹,里面含有*.bar文件.

为掌握决 #2 的主题材料,
则须要用服务开展打包, 抽象出生龙活虎部分接口以至基类的实 现, 并
应用有的相近的设计形式(工厂情势卡塔尔(قطر‎和java的特点(反射卡塔尔国.

9.3 获取流程发起人

假诺在开发银行流程的时候调用了上面包车型地铁代码:

?

1
identityService.setAuthenticatedUserId(currentUserId);

引擎会记录启动人,即在ACT_HI_PROINST表的START_USER_ID字段,可以透过上边包车型大巴代码获取。

?

1
2
HistoricProcessInstance
hi = historyService.createHistoricProcessInstanceQuery().singleResult();
hi.getStartUserId();

Activiti的数据库版本的自动进级. 当我们进级activiti的本兔时,
其实大家只必要改善JA路虎极光的版本号, 而不用关爱起底层数据库是不是需求晋级,
activiti在其表中会记录数据库scheme的版本号,
运转时会自动决断并依靠必要自动更新数据库. 那也是那多少个值得借鉴之处,
极其是当那一个模块被几个连串所选取时。

5.4 已完成(HistoricProcessInstance)

曾经终止的流程实例。

从表ACT_HI_PROCINST中询问数据。

?

1
2
3
4
5
6
7
8
9
10
/**
 *
获取已经完成的流程实例查询对象
 *
@param userId    用户ID
 */
@Transactional(readOnly
=
true)
public
HistoricProcessInstanceQuery createFinishedProcessInstanceQuery(String userId) {
    HistoricProcessInstanceQuery
finishedQuery = historyService.createHistoricProcessInstanceQuery()
            .processDefinitionKey(getProcessDefKey()).finished();
    return
finishedQuery;
}

❷ 运行生成提前还款表达书, 其包含详细金额多少

8.结束

前边就想写那篇文章,今后算是达成了,开支了多少个钟头,希望能节约你几天的时日。

请读者留神阅读Activiti的客商手册和Javadoc。

要是有何样难点仍旧对于作用的完成成越来越好的不二等秘书籍迎接提议、分享。

☞ 选用伏贴的劳作流引擎

6.3 流程追踪

图片格局展现当前节点:

图片 7

列表形式显得流程流转进程:

图片 8

数据库设计

2.2 使用引擎提供的Form照旧自定义业务Form

不停的重构满含:

6.1 单唯二个列表肩负申请

如此这般的补益是申请和流程办理分离开管理,列表展现未运营流程的请假记录(数据库PROCESS_INSTANCE_ID为空)。

提请界面包车型地铁截图:

图片 9

❶ 客户联系顾客服务人口,提交报名, 满含借贷消息, 手持身份ID照片,
银行卡新闻等

2.3.1 startProcessInstanceByKey

javadoc对其表达:

startProcessInstanceByKey(String processDefinitionKey, Map variables) 
          Starts a new process instance in the latest version of the process definition with the given key

其中businessKey就是专门的职业ID,比方要提请请假,那么先填写登记音信,然后(保存+运营流程),因为请假是单身设计的数据表,所以保存后收获实体ID就可以把它传给processInstanceBusinessKey办法运转流程。当须求基于businessKey查询流程的时候就能够经过API查询:

?

1
runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(processInstanceBusinessKey,
processDefinitionKey)

提出数据库冗余设计:在业务表设计的时候加多一列:PROCESS_INSTANCE_ID
varchar2(64)
,在流程运转现在把流程ID更新到事情表中,那样不管从作业或然流程都能够查询到对方!

特意表达: 此方法运转时自动选拔新型版本的流水生产线定义。

发表评论

电子邮件地址不会被公开。 必填项已用*标注