Activiti职业流引擎使用

作者:澳门微尼斯人娱乐

为了化解#1的标题, 则必要定义出流程--步骤—业务(央求类型)—处理人/组 的布置 关系, 并在流水生产线流转时自动安装, 并非在流程描述文件 (bpmn)里 钦赐

2.4 同步客商数量

本条标题也是相当多的人询问过,Activiti扶助对职分分配到:钦点人、钦赐组、两个结合,而那几个人和组的音信都保存在ACT_ID..表中,有谈得来的顾客和组(剧中人物)管理让十分多人仓皇了;原因是因为种种系统都会设有一个权力管理模块(维护:顾客、部门、角色、授权),不精通该怎么和Activiti同步。

5.1 未签收(Task)

此类职分针对于把Task分配给四个角色时,举个例子部门长官,因为机构老总剧中人物能够钦命多少人所以须要先签收再办理,术语:抢占式

对应的API查询:

?

1
2
3
4
5
6
7
8
9
10
/**
 * 获取未签收的任务查询对象
 * @param userId    用户ID
 */
@Transactional(readOnly = true)
public TaskQuery createUnsignedTaskQuery(String userId) {
    TaskQuery taskCandidateUserQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey())
            .taskCandidateUser(userId);
    return taskCandidateUserQuery;
}

3.配置

❸ 运转搭飞机构打开修改操

3.1 集成Spring

对此和Spring的集成Activiti做的不易,轻松布署部分Bean代理就能够兑现,可是有三个和专业相关的地点要唤醒:

  • 配置processEngineConfiguration的时候属性transactionManager要动用和职业效率的同贰个事务管理Bean,不然事务不联合。

  • 对于达成了org.activiti.engine.delegate包中的接口的类供给被专门的学问调整的贯彻类须求被Spring代理,而且拉长事务的Annotation也许在xml中配置,举例:

    /**
     * 创建缴费流程的时候自动创建实体
     *
     * @author HenryYan
     */
    @Service
    @Transactional
    publicclass CreatePaymentProcessListener implementsExecutionListener {
       ....
    }
    

?

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;
}

9.3 获取流程发起人

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

?

1
identityService.setAuthenticatedUserId(currentUserId);

引擎会记录启动人,即在ACT_HI_PROINST表的START_USER_ID字段,能够通过上面包车型客车代码获取。

?

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

☞ 基础框架代码的安顿性

6.UI及截图

结合实际业务描述二个业务从初阶到停止的长河,对于吸引的校友看完峰回路转了;这里运用请假作为例子。

2.2.1 引擎提供的Form

概念表单的秘籍在各样Task标签中定义extensionElementsactiviti:formProperty就能够,达到那个节点的时候可以通过API读取表单元素。

Activiti官方的事例使用的正是在流水生产线定义中装置每三个节点展现怎么的表单哪些字段需求出示、哪些字段只读、哪些字段必填。

而是这种艺术独有适用于相比较简单的流程,对于有个别复杂也许页面须要工作逻辑的论断的地方就不适用了。

对于数据的保留都以在斯特林发动机的表中,不便于和其余表的涉及、对整体系统的希图也许有损!

下图为宗旨的架构设计

2.6 Eclipse Designer存在的主题素材

那几个插件有多少个很讨厌的Bug一直未修复,安装了插件后Eclipse的复制和粘帖急忙键会被撤换为(Ctrl Insert、Shift Insert);Bug描述请见:

  • Activit Forums中报告的Bug

  • Jira的登记

之所以最后大家只可以单独开二个安装了Eclipse Designer的Eclipse特意用来统筹流程图,那样就不影响健康使用Eclipse JAVAEE了。

5.2 办理中(Task)

该类职分数据类源有二种:

  • 签收后的,5.第11中学签收后就应为办理中状态

  • 节点钦赐的是实际到一位,并非剧中人物

对应的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;
}

2.5.1 大家的方法

大概你会好奇,因为大家从没采取Activiti Modeler,大家感到用Viso已经能表明流程图的意味了,并且项目高管也是工夫出身,和开辟人士也便于沟通。

当前这几个项目是首先个使用Activiti的,初叶大家在需求应用研商阶段采纳Viso设计流程图,利用泳道流程图统一盘算和顾客联系,分明后由担负流程的开采人士用Eclipse Designer设计赢得bpmn20.xml,最终布置。

在安顿和兑现该连串时会有

6.2 流程状态

图片 1

1.1 作者与做事流引擎

在首先家商厦做事的时候根本任务就是开荒OA系统,当然基本都是有工作流的支撑,但是当下应用的工作流引擎是公司部分牛人开拓的(据书上说是用八个开源的引擎修改的),名叫CoreFlow;效率相对Activiti来讲相比较弱,可是能满意平常的应用,当然也会有那多少个的题目因而后来大家只可以修改引擎的代码打补丁。

今日是自个儿工作的第二家公司,因为要开荒ERP、OA等连串必要选拔职业流,在项目调研阶段自个儿先物色资料选拔使用哪个开源行事流引擎,最后明确了Activiti5并依附厂商的架构做了一些DEMO。

5.各个情状的天职查询以及和业务对象关联

大家方今分为4中状态:未签收、办理中、运维中、已形成。

询问到职责还是流程实例后要彰显在页面,今年需求增多业务数据,最后结果正是职业和流程的并集,请参见6.2

◆✦以下对第二、三点张开辟展✦◆

5.各类情况的义务查询以及和事务对象关系

大家眼下分为4中状态:未签收、办理中、运转中、已形成。

查询到职责依旧流程实例后要显得在页面,这年供给丰富业务数据,最后结果正是业务和流程的并集,请参谋6.2

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 {
   ....
}

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

发起流程的要害原因是顾客期待根据合同进行提前还款. 流程关键步骤为:

2.1.1 修改源代码格局

修改源码

org.activiti.engine.impl.bpmn.diagram.ProcessDiagramCanvas

在构造方法

public ProcessDiagramCanvas(int width, int height)

中有一行代码是安装字体的,暗中认可是用 Arial 字体,这正是乱码发生的原由,把字改为地面包车型大巴普通话字体就可以,举个例子:

Font font = new Font("WenQuanYi Micro Hei", Font.BOLD, 11);

理所必然若是您有安排文件读取工具那么能够安装在*.properties文件中,笔者就是那般做的:

Font font = new Font(PropertyFileUtil.get("activiti.diagram.canvas.font"), Font.BOLD, 11);
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文件。

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.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;每一遍安插一次流程定义就能够加多一条数据,同名的版本号加上。

专门表明: 此能够钦命差异版本的流程定义,让客商多一层选取。

6.1 单唯一个列表担当申请

如此这般的实惠是报名和流程办理分离开管理,列表彰显未运行流程的请假记录(数据库PROCESS_INSTANCE_ID为空)。

报名分界面包车型大巴截图:

图片 2

2.首先使用境遇难题收罗

因为Activiti刚刚退出不久所以资料相比较空缺,汉语资料更少的可怜,所以开端的时候四头雾水(即便事先用过专门的学业流,可是认为距离非常多),并且官方的手册还不是很完善;所以自身把自己在上学应用的长河遭遇的局地疑团都位列出来分享给我们;以下几点是本人遭遇和想到的,假设您还会有怎么着疑难能够在评价四之日自身沟通再补充。

一. 借款人银行卡新闻修改

2.2.1 引擎提供的Form

概念表单的措施在各样Task标签中定义extensionElementsactiviti:formProperty就能够,达到那一个节点的时候能够经过API读取表单成分。

Activiti官方的例证使用的正是在工艺流程定义中设置每一个节点展现怎么的表单哪些字段必要出示、哪些字段只读、哪些字段必填。

而是这种艺术独有适用于相比轻巧的流程,对于有些复杂大概页面要求专业逻辑的判别的场合就不适用了。

对于数据的保存都以在内燃机的表中,不低价和别的表的关系、对全系列统的安顿也不利!

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

对此专门的职业流引擎的解说请参见百度完善:办事流引擎

2.1 铺排流程图后普通话乱码

乱码是直接缠绕着国人的题目,此前各样能力、工具出现乱码的难点写过好多稿子,这里也不例外……,Activiti的乱码难点在流程图中。

流程图的乱码如下图所示:

图片 3

消除办法有三种:

❹ 运行代扣还款金额, 结清借款

5.5 查询时和职业关系

唤醒:此前在作业对象增加了PROCESS_INSTANCE_ID字段

思路:以后得以应用那个字段查询了,不管是Task仍旧ProcessInstance都足以得到流程实例ID,能够依赖流程实例ID查询实体然后把流程对象设置到实体的贰特性质中由Action恐怕Controller输出到前台。

代码请参见:

2.3.3 怎样挑选

提出选择startProcessInstanceByKey,特殊景况要求利用过去的本子选拔使用startProcessInstanceById

5.2 办理中(Task)

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

  • 签收后的,5.第11中学签收后就应该为办理中状态

  • 节点钦赐的是具体到壹个人,而不是剧中人物

对应的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;
}

➤ 依据业务要求提供ASync的processor处理基类, 因为其实运用中发掘, 一些事情的拍卖(如批量)须要一段时间的推行技艺幸不辱命, 而异步管理基类则完毕基础达成, 并由相应子类去贯彻虚函数就可以.

2.2.2 自定义业务Form

这种艺术应该是豪门用的最多的了,因为相似的事连串统业务逻辑都会比较复杂,而且数据库中过多表都会有依赖关系,表单中有无数景况剖断。

举例说大家的系统适用jQuery UI作为UI,有相当的多javascript代码,页面包车型大巴无数操作须要新鲜管理(举个例子:四个挑选的排挤、种种节点依据项目和操作人展现差别的按键);基本种种集团都有一套本身的UI风格,要保险多少个体系的操作习惯一致只好动用自定义表单才能满意。

6.3 流程追踪

图形情势展现当前节点:

图片 4

列表格局显得流程流转进度:

图片 5

2.1.2 使用压缩包格局地署

Activiti协理布置*.bpmn20.xml、bar、zip格式的流水生产线定义。

运用Activit Deisigner工具设计流程图的时候会有多个项目标文本:

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

  • .bpmn20.xml布置工具自动依照.activiti文件生成的xml文件

  • .png流程图图片

消除办法就是把xml文件和图表文件同有时间布署,因为在单独布置xml文件的时候Activiti会自动生成一张流程图的图片文件,不过如此在选择的时候坐标和图表对应不起来……

因而把xml和图纸相同的时间布置的时候Activiti自动关联xml和图表,当须要获得图片的时候一贯重临计划时压缩包里面包车型地铁图纸文件,实际不是Activiti自动生成的图纸文件

正如上边曾谈起, 对于一个系统规划, 不大概一步到位, 在后期时要掀起最急需化解的难点, 举例在那个种类先河阶段, 最主旨的设计包涵:

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

9.1 手动设置职责办理人

?

1
<usertask id="hrAudit" name="人事审批" activiti:assignee="${hrUserId}"></usertask>

动态钦赐任务办理人是群里面询问相当多的标题之一,其实正是一层窗户纸,只要在义务到位的时候传递activiti:assignee属性中的变量就可以。


Map<String, Object> variables = new HashMap<String, Object>();

variables.put("hrUserId", hrUserId);

taskService.complete(taskId, variables);


1.3 Activiti资料

  • 官网:

  • 下载:

  • 本子:Activiti的版本是从5开始的,因为Activiti是使用jBPM4的源码;本子发布:几个月发布一遍。

  • Eclipse Plugin: 

  • Activit中文群:236540304

  1. 能够知足区别的业务域的必要, 如出借, 借款, 资金有关的切实事务数据

  2. 可见记录每一步的操作审查批准或业务进行结果, 同期记录相关的数额快速照相

2.3.3 怎么样挑选

提出选择startProcessInstanceByKey,特殊情状供给利用过去的本子选拔选择startProcessInstanceById

9.3 获取流程发起人

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

?

1
identityService.setAuthenticatedUserId(currentUserId);

引擎会记录启使人迷恋,即在ACT_HI_PROINST表的START_USER_ID字段,能够由此上面包车型地铁代码获取。

?

1
2
HistoricProcessInstance hi = historyService.createHistoricProcessInstanceQuery().singleResult();
hi.getStartUserId();
2.1.2.1 使用工具打包Bar文件

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

主编:

2.1 安排流程图后粤语乱码

乱码是一向缠绕着国人的难点,在此之前各种技能、工具出现乱码的主题素材写过繁多小说,这里也不例外……,Activiti的乱码难题在流程图中。

流程图的乱码如下图所示:

图片 6

化解办法有两种:

6.2 流程状态

图片 7

10. 职务代办

重重人问“Owner”属性为啥是空的,何时用?要询问它的功效首先要明白“代办”。

代办的定义能够用上边的一句话回顾:

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

来看那几个单元测量试验你就知道怎么是代办:ProcessTestDelegateTask

最好把activiti-study以此项目下载下来导入到Eclipse中运作一下:

➤将各个管理类(业务管理类, 流程管理人/组分配管理类, 文告管理类) 通过RegisterService的会集登记管理, 并且帮助选择对于特定的流程达成特定的拍卖类来代替暗中同意的拍卖类

1.2 Activiti与JBPM5?

对于Activiti、jBPM4、jBPM5我们应当怎么挑选,在InfoQ上有一篇小说写的很好,从大的局面比较各类引擎之间的歧异,请参谋小说:纵观jBPM:从jBPM3到jBPM5以及Activiti5

1.3 Activiti资料

  • 官网:

  • 下载:

  • 本子:Activiti的版本是从5开始的,因为Activiti是使用jBPM4的源码;本子公布:多少个月发表一回。

  • Eclipse Plugin: 

  • Activit中文群:236540304

6.3 流程追踪

图形格局展现当前节点:

图片 8

列表格局显得流程流转进程:

图片 9

3. 兑现该业务关联的具体步骤的操作processor类(如审查批准或和其他系统衔接, 实现实际的职业),

2.3.1 startProcessInstanceByKey

javadoc对其表明:

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

 

其中businessKey便是事情ID,举例要提请请假,那么先填写登记音信,然后(保存 运营流程),因为请假是单身设计的数据表,所以保存后获得实体ID就能够把它传给processInstanceBusinessKey形式运维流程。当须要依据businessKey查询流程的时候就可以经过API查询:

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

 

议数据库冗余设计:在业务表设计的时候增添一列:PROCESS_INSTANCE_ID varchar2(64),在工艺流程运转将来把流程ID更新到事情表中,那样不管从作业依旧流程都得以查询到对方!

特意表达: 此方法运营时自动选用新型版本的流程定义。

2.2.2 自定义业务Form

这种形式应该是豪门用的最多的了,因为相似的专业系统专业逻辑都会比较复杂,並且数据库四川中国广播集团大表都会有依赖关系,表单中有非常多动静决断。

比方说大家的系统适用jQuery UI作为UI,有大多javascript代码,页面包车型地铁洋洋操作供给特别处理(举个例子:多个选项的排外、每一种节点遵照项目和操作人展现分化的开关);基本每一个厂商都有一套本身的UI风格,要保证四个种类的操作习惯一致只好使用自定义表单手艺满意。

2.2.2 自定义业务Form

这种措施应该是我们用的最多的了,因为相似的作业种类业务逻辑都会比较复杂,并且数据库中众多表都会有依附关系,表单中有无数情状推断。

举例说我们的系统适用jQuery UI作为UI,有相当多javascript代码,页面包车型地铁居多操作要求特殊管理(比如:多少个选用的排斥、各类节点遵照项目和操作人展现不一致的按键);基本种种集团都有一套本身的UI风格,要维持七个体系的操作习贯一致只好选拔自定义表单能力满足。

在阳台的其实运行中, 有三种二种的事务供给管理, 包蕴借款人, 出借人, 资金等等, 同一时候还涉嫌到各样分化的业务部门, 并且流程的流转操作人士和单位也乘机公司事务的向上而各异的调解. 设计二个基础的流水生产线框架和兑现基础代码, 变成简单的支出形式是该体系的重要性. 因而总种类统的统一筹算涉及到以下器重多少个地方:

2.1.2.2 使用Ant脚本打包Zip文件

那也是我们采纳的秘技,你能够手动选项xml和png打包成zip格式的文件,也可以像大家同样采取ant target的措施打包那多少个公文。

<?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>

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

ant workflow.package.oa.leave

今后配置bar大概zip文件查看流程图图片就不是乱码了,而是你的压缩包里面包车型地铁png文件。

3.配置

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

代码请转移:

本文由威尼斯人科技发布,转载请注明来源

关键词: 微尼斯人娱乐 威尼斯娱乐