听别人说工作流的平台管理种类规划,Activiti工作流引擎使用

如此那般也许那样的迷惑大概斗争,

6.1 单独贰个列表负责申请

如此那般的益处是报名和流程办理分离开处理,列表显示未运行流程的请假记录(数据库PROCESS_INSTANCE_ID为空)。

报名界面包车型客车截图:

图片 1

2.3.3 怎么着挑选

建议使用startProcessInstanceByKey,特殊意况需求利用过去的本子选用选用startProcessInstanceById

☞ 采用合适的办事流引擎

2.1.2 使用压缩包格局布置

Activiti补助安排*.bpmn20.xml、bar、zip格式的流程定义。

应用Activit Deisigner工具设计流程图的时候会有四个品类的文本:

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

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

  • .png流程图图片

消除办法正是把xml文件和图表文件同时铺排,因为在单独安排xml文件的时候Activiti会自动生成一张流程图的图纸文件,不过这么在选用的时候坐标和图表对应不起来……

据此把xml和图片同时配备的时候Activiti自动关联xml和图纸,当需求得到图片的时候一贯再次回到陈设时压缩包里面包车型客车图纸文件,而不是Activiti自动生成的图纸文件

2.1.2 使用压缩包格局地署

Activiti援助安顿*.bpmn20.xml、bar、zip格式的流水生产线定义。

使用Activit Deisigner工具设计流程图的时候会有多少个类其他文书:

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

  • .bpmn20.xml设计工具自动依据.activiti文件生成的xml文件

  • .png流程图图片

消除办法正是把xml文件和图表文件同时布置,因为在单独安排xml文件的时候Activiti会自动生成一张流程图的图样文件,可是这么在行使的时候坐标和图表对应不起来……

故此把xml和图纸同时配备的时候Activiti自动关联xml和图表,当需求获得图片的时候一贯回到布署时压缩包里面包车型地铁图样文件,而不是Activiti自动生成的图片文件

Property表里是不是须求必要用区别的字段(LONG_VALUE,
TEXT_VALUE, DOUBLE_VALUE等)存差异类其余值;还是直接都存成字符串,
在代码中再依照需求转成Long, Double等?当然三种完结都以立见功用的,
并且各有利害,
并且个人觉得存在不一致的字段上亮点更大学一年级些(首要反映在询问效能),
不过怎么样进一步的让本身信服?
在看activiti的文书档案时发现外部的作业数据以Map的主意存在activiti的数据库中,
那么activiti的设计者一样会遇到同样的标题.
通过查看源代码以及其数据库设计, 发现其将数据存入不一样的字段.
不过在自作者的宏图中, 作者并没有完全照搬Activiti的处理格局, 比如:
笔者一贯不为布尔类型加单独的字段,
而是以0恐怕1的格局存入LONG_VALUE里。

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

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

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.1 引擎提供的Form

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

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

只是那种形式唯有适用于比较不难的流水线,对于有些复杂或许页面须要工作逻辑的论断的情事就不适用了。

对此数据的保留都以在内燃机的表中,不便民和其余表的关系、对全部系列的规划也有损!

此处举多少个例证

6.3 流程跟踪

图片方式呈现当前节点:

图片 2

列表方式体现流程流转进度:

图片 3

2.3 业务和流程的关联方式

那些题材在群里面很几人都问过,那也是自我刚刚起初迷惑的地点;

新生看了以下API发现RuntimeService有多个主意:

哪个种类完毕更好?

6.3.1 当前节点定位JS

Java代码请移步:

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

代码移步:

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文件。

❶ 借款人联系客服职员, 提交报名

2.4 同步用户数据

那些标题也是相比多的人了然过,Activiti援救对义务分配到:钦赐人、内定组、两者结合,而这么些人和组的消息都保存在ACT_ID..表中,有谈得来的用户和组(剧中人物)管理让许几人慌慌张张了;原因是因为每个系统都会设有贰个权力管理模块(维护:用户、部门、剧中人物、授权),不晓得该怎么和Activiti同步。

2.1.2.1 使用工具打包Bar文件

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

图片 4

2.5 流程图设计工具用什么

Activiti提供了七个流程设计工具,可是面向对象差异。

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

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

4.采纳单元测试

单元测试均接纳Spring的AbstractTransactionalJUnit4SpringContextTests作为SuperClass,并且在测试类添加:

?

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

虽说Activiti也提供了测试的一部分超类,可是感觉倒霉用,所以本身包裹了有的艺术。

代码请转移:

  1. 一部分通用的activiti流程,
    如一步操作即成立后只必要一步成功操作, 两步流程 –
    创制后一步审核一步操作等, 差异的工作会使用相同的流程.

  2. 在activiti流程相同的事态下,
    分化的事情的步子其处理人/组则不一致

  3. 今非昔比业务流程的实际上代码开发相应简洁,
    和劳作流引擎解耦, 即实际的开 发人士在不打听办事流引擎具体做事原理的气象下得以展开火速的支付, 并
    只供给关心具体 的政工必要

1.简单介工作流引擎与Activiti

对此工作流引擎的表明请参见百度宏观:工作流引擎

❶ 用户联系客户服务人口,提交报名, 包蕴借款音信, 手持身份证照片,
银行卡消息等

Activiti工作流引擎使用

1.1 作者与做事流引擎

在首先家商行做事的时候根本任务便是开发OA系统,当然基本都以有工作流的支撑,不过当下应用的工作流引擎是店铺部分牛人开发的(听说是用叁个开源的引擎修改的),名称叫CoreFlow;功用相对Activiti来说相比较弱,可是能满意日常的运用,当然也有那些的标题因而后来大家只可以修改引擎的代码打补丁。

现在是自个儿工作的第1家合作社,因为要开发E帕杰罗P、OA等体系需求采用工作流,在项目调查研讨阶段自个儿先物色资料选取使用哪个开源做事流引擎,最后鲜明了Activiti5并根据专营商的架构做了有的DEMO。

正如下边曾说到, 对于多少个系统规划, 不可能一步到位,
在最初时要吸引最亟需化解的题目, 比如在那几个体系起始阶段,
最基本的设计包括:

5.1 未签收(Task)

该类职分针对于把Task分配给1个剧中人物时,例如部门官员,因为机关领导剧中人物能够钦命两个人所以需求先签收再办理,术语:抢占式

对应的API查询:

/**
 * 获取未签收的任务查询对象
 * @param userId    用户ID
 */
@Transactional(readOnly = true)
publicTaskQuery createUnsignedTaskQuery(String userId) {
    TaskQuery taskCandidateUserQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey())
            .taskCandidateUser(userId);
    returntaskCandidateUserQuery;
}

?

6.1 单独三个列表负责申请

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

申请界面包车型客车截图:

图片 5

据书上说那样的框架形成基础代码后,
最后对于1个完毕具体业务的开发职员来说, 其落成一个业务流程代码首要不外乎:

2.3 业务和流程的涉及格局

以此难题在群里面很四人都问过,那也是自个儿刚刚开首迷惑的地点;

后来看了以下API发现RuntimeService有多个点子:

2.5.1 大家的法门

莫不你会惊讶,因为大家从不应用Activiti
Modeler,大家认为用Viso已经能发布流程图的意味了,而且项目老董也是技巧出身,和开发人士也便于调换。

脚下这么些连串是首先个使用Activiti的,初叶咱们在须求调查研商阶段选择Viso设计流程图,利用泳道流程图陈设和客户联系,分明后由负责流程的开发职员用Eclipse
Designer设计赢得bpmn20.xml,最终安插。

多变历程

5.5 查询时和作业关系

唤醒:以前在工作对象添加了PROCESS_INSTANCE_ID字段

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

代码请参考:

6.3.1 当前节点定位JS

Java代码请移步:

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

代码移步:

二. 提前还款流程

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文件。

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更新到业务表中,那样不管从作业依旧流程都足以查询到对方!

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

☞设计通用的底层数据来支撑分裂的政工

2.4.1 建议处理方式

Activiti有一个IdentityService接口,通过那么些接口能够操控Activiti的ACT_ID_*表的数量,一般的做法是用工作类别的权杖管理模块维护用户数据,当举行CRUD操作的时候在原有工作逻辑前边添加同步到Activiti的代码;例如添加四个用户时同步Activiti
User的代码片段:

/**
 * 保存用户信息 并且同步用户信息到activiti的identity.User,同时设置角色
 * @param user
 * @param roleIds
 */
public void saveUser(User user, List<Long> roleIds, boolean synToActiviti) {
    accountManager.saveEntity(user);
    String userId = user.getId().toString();

    if (synToActiviti) {
        List<org.activiti.engine.identity.User> activitiUsers = identityService.createUserQuery().userId(userId).list();
        if (activitiUsers.size() == 1) {
            //更新信息
            org.activiti.engine.identity.User activitiUser = activitiUsers.get(0);
            activitiUser.setFirstName(user.getName());
            activitiUser.setLastName("");
            activitiUser.setPassword(user.getPassword());
            activitiUser.setEmail(user.getEmail());
            identityService.saveUser(activitiUser);

            // 删除用户的membership
            List<Group> activitiGroups = identityService.createGroupQuery().groupMember(userId).list();
            for (Group group : activitiGroups) {
                identityService.deleteMembership(userId, group.getId());
            }

            // 添加membership
            for (Long roleId : roleIds) {
                Role role = roleManager.getEntity(roleId);
                identityService.createMembership(userId, role.getEnName());
            }

        } else {
            org.activiti.engine.identity.User newUser = identityService.newUser(userId);
            newUser.setFirstName(user.getName());
            newUser.setLastName("");
            newUser.setPassword(user.getPassword());
            newUser.setEmail(user.getEmail());
            identityService.saveUser(newUser);

            // 添加membership
            for (Long roleId : roleIds) {
                Role role = roleManager.getEntity(roleId);
                identityService.createMembership(userId, role.getEnName());
            }
        }
    }

}

 

去除操作也和这一个就像!

无论是从工作系统一保险证用户依然从Activiti维护,肯定要分明一方,然后CRUD的时候共同到对方,假设急需一块七个子系统那么能够再调用WebService完结。

2.6 Eclipse Designer存在的难题

其一插件有三个很看不惯的Bug一贯未修复,安装了插件后Eclipse的复制和粘帖急迅键会被转移为(Ctrl+Insert、Shift+Insert);Bug描述请见:

  • Activit
    Forums中告知的Bug

  • Jira的登记

所以最后咱们只可以单独开一个装置了Eclipse
Designer的Eclipse专门用来统一筹划流程图,那样就不影响健康使用Eclipse
JAVAEE了。

如上所说, 那样的一个数量安插必须可以满意:

2.第贰使用蒙受难题采访

因为Activiti刚刚退出不久所以资料相比空缺,普通话资料越发少的可怜,所以开始的时候四头雾水(固然在此以前用过工作流,但是感觉距离很多),而且官方的手册还不是很完善;所以作者把自家在攻读应用的长河遭遇的有的难题都位列出来分享给大家;以下几点是自个儿遭受和想到的,假使你还有怎么样疑难能够在评价竹秋本身沟通再补充。

2.4.1 建议处理方式

Activiti有一个IdentityService接口,通过那个接口能够操控Activiti的ACT_ID_*表的多少,一般的做法是用工作连串的权杖管理模块维护用户数量,当进行CRUD操作的时候在原始业务逻辑前面添加同步到Activiti的代码;例如添加一个用户时同步Activiti
User的代码片段:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
/** * 保存用户信息 并且同步用户信息到activiti的identity.User,同时设置角色 * @param user * @param roleIds */public void saveUser(User user, List<Long> roleIds, boolean synToActiviti) { accountManager.saveEntity(user); String userId = user.getId().toString();   if (synToActiviti) {      List<org.activiti.engine.identity.User> activitiUsers = identityService.createUserQuery().userId(userId).list();       if (activitiUsers.size() == 1) {          //更新信息         org.activiti.engine.identity.User activitiUser = activitiUsers.get(0);          activitiUser.setFirstName(user.getName());           activitiUser.setLastName("");          activitiUser.setPassword(user.getPassword());            activitiUser.setEmail(user.getEmail());          identityService.saveUser(activitiUser);             // 删除用户的membership          List<Group> activitiGroups = identityService.createGroupQuery().groupMember(userId).list();            for (Group group : activitiGroups) {                identityService.deleteMembership(userId, group.getId());          }            // 添加membership          for (Long roleId : roleIds) {               Role role = roleManager.getEntity(roleId);                identityService.createMembership(userId, role.getEnName());           }        } else {         org.activiti.engine.identity.User newUser = identityService.newUser(userId);          newUser.setFirstName(user.getName());            newUser.setLastName("");           newUser.setPassword(user.getPassword());         newUser.setEmail(user.getEmail());           identityService.saveUser(newUser);          // 添加membership          for (Long roleId : roleIds) {               Role role = roleManager.getEntity(roleId);                identityService.createMembership(userId, role.getEnName());           }        }    } }

view
rawAccountServiceImpl.java hosted
with ❤ by GitHub

除去操作也和那些就如!

任由从作业种类保障用户依然从Activiti维护,肯定要规定一方,然后CRUD的时候共同到对方,假诺急需一块八个子系统那么能够再调用WebService实现。

该流程发起原因根本是出于借款人银行卡转移原因须求修改. 流程关键步骤为:

1.1 笔者与做事流引擎

在首先家集团工作的时候根本任务正是开发OA系统,当然基本都是有工作流的援救,然则当下选取的行事流引擎是专营商部分牛人开发的(传说是用2个开源的斯特林发动机械修理改的),名称叫CoreFlow;功用相对Activiti来说相比较弱,不过能满足普通的行使,当然也有不可计数的题材由此后来大家只可以修改引擎的代码打补丁。

明日是自己工作的第三家店铺,因为要开发E智跑P、OA等系统需求接纳工作流,在品种调查研讨阶段本身先找找资料选用选取哪个开源工作流引擎,最终明确了Activiti5并根据商户的架构做了某些DEMO。

8.结束

事先就想写那篇小说,将来好不简单不负众望了,费用了多少个小时,希望能节省你几天的大运。

请读者仔细翻阅Activiti的用户手册和Javadoc。

比方有何难点照旧对于成效的落到实处有更好的点子欢迎建议、分享。

  1. 完结多少个创设Request的页面,
    用于录入工作数据

  2. 金玉满堂二个Request详细页面, 用于显示详情,
    包含操作历史, 和工作操作按钮

1.2 Activiti与JBPM5?

对于Activiti、jBPM四 、jBPM5大家应该怎么着选择,在InfoQ上有一篇小说写的很好,从大的规模比较种种引擎之间的差别,请参考作品:纵观jBPM:从jBPM3到jBPM5以及Activiti5

1.2 Activiti与JBPM5?

对此Activiti、jBPM四 、jBPM5我们应当怎么抉择,在InfoQ上有一篇文章写的很好,从大的框框相比各种引擎之间的差距,请参见小说:纵观jBPM:从jBPM3到jBPM5以及Activiti5

➤ 数据库设计 和RequestService对底层数据操作的包装

2.2.1 引擎提供的Form

概念表单的不二法门在每一种Task标签中定义extensionElementsactiviti:formProperty即可,到达这些节点的时候能够透过API读取表单成分。

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

但是那种艺术唯有适用于比较简单的流水生产线,对于有个别复杂大概页面必要工作逻辑的论断的状态就不适用了。

对此数据的保留都以在内燃机的表中,不方便人民群众和别的表的涉嫌、对整个种类的设计也有损!

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

图片 6

5.各个状态的职分查询以及和作业对象关联

我们当下分为4中状态:未签收、办理中、运转中、已形成。

询问到职分如故流程实例后要出示在页面,那些时候供给丰硕业务数据,最后结出便是业务和流程的并集,请参见6.2

2.先河使用碰着题目采访

因为Activiti刚刚退出不久所以资料相比空缺,普通话资料特别少的可怜,所以伊始的时候二只雾水(固然事先用过工作流,可是觉得距离很多),而且官方的手册还不是很完美;所以我把作者在读书运用的经过境遇的部分疑问都位列出来分享给大家;以下几点是自家遇上和想到的,借使你还有哪些疑点能够在评论花潮小编调换再补偿。

三个Request代表某一位发起的请求, Snapshot代表那么些流程的每一步操作.
Property则分级为Request的Snapshot的切切实实的数据,
当其REQUEST_ID非空SNAPSHOT_ID为空时表示其为REQUEST的习性(SNAPSHOT同理),
即用户发起呼吁所指点的数据. 如: 用户音讯修改:
PROPETiguanTY则包罗NAME(KEY)为USECRUISER_ID(用户唯一ID),
ATTACHMENT(用户手持身份证照片), EMAIL(修改项)等相应的值. 而对于SNAPSHOT,
则记录对应审核以及操作的音信,
其相应的PROPELacrosseTY则保留了对某些数据修改前后的值.

2.6 Eclipse Designer存在的题材

以此插件有一个很讨厌的Bug向来未修复,安装了插件后Eclipse的复制和粘帖急迅键会被更换为(Ctrl+Insert、Shift+Insert);Bug描述请见:

  • Activit
    Forums中报告的Bug

  • Jira的登记

为此最终大家只能单独开二个安装了Eclipse
Designer的Eclipse专门用来陈设流程图,那样就不影响符合规律使用Eclipse
JAVAEE了。

5.5 查询时和工作涉及

提示:在此以前在业务对象添加了PROCESS_INSTANCE_ID字段

思路:以往得以利用那个字段查询了,不管是Task依然ProcessInstance都可以博得流程实例ID,能够依照流程实例ID查询实体然后把流程对象设置到实体的1性情格中由Action只怕Controller输出到前台。

代码请参见:

➤RequestQuery支持统一的查询入口对业务流程数据开始展览询问

2.1.2.1 使用工具打包Bar文件

右键项目名称然后点击“Create deployment
artifacts”,会在src目录中开创deployment文本夹,里面包蕴*.bar文件.

7.开启Logger

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

图片 7

4.1 验证流程图设计是或不是正确

代码请转移:

2.5 流程图设计工具用如何

Activiti提供了五个流程设计工具,可是面向对象区别。

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

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

Activiti中提供方便的查询类, 如: ProcessInstanceQuery, TaskQuery.
其同时匡助遵照Process和Task相应的属性数据实行询问,
和Request/Snapshot以及property有相当的大的相似之处,
借鉴并基于实际景况贯彻和谐的RequestQuery类, 援助各项复杂查询, 如:
依据钦命的property的name和value查询, 帮助or的查询等。

2.2.2 自定义业务Form

那种艺术应该是豪门用的最多的了,因为相似的工作系统工作逻辑都会相比复杂,而且数据库黑龙江中国广播企业余大学表都会有依靠关系,表单中有无数景况判断。

比如大家的系统适用jQuery
UI作为UI,有过多javascript代码,页面的成都百货上千操作供给特殊处理(例如:七个选用的排斥、种种节点依照项目和操作人突显差别的按钮);基本每一种公司都有一套自个儿的UI风格,要有限支撑四个种类的操作习惯一致只可以动用自定义表单才能知足。

2.1 铺排流程图后中文乱码

乱码是一向缠绕着国人的题材,以前各种技术、工具出现乱码的题目写过无数篇章,那里也不例外……,Activiti的乱码难点在流程图中。

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

图片 8

消除办法有两种:

➤ 近来, 其余三个品种其利用到的光景和那几个种类有类似之处,
其独自于该业务管理平台. 在那种意况下, 将该工作流相关的模块进行公共化,
以JA汉兰达包的款型提供, 使得别的四个系统的支付能够短时间内达到相同的效应

6.UI及截图

结合实际业务描述二个事情从开首到停止的进度,对于迷惑的同学看完柳暗花明了;这里运用请假作为例子。

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. 将流程涉及的processor和呼应的事体项目,
    流程名, 流程步骤进行注册绑定

7.开启Logger

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

4.2 业务对象和流程关联测试

代码请转移:

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

3.1 集成Spring

对此和Spring的集成Activiti做的不错,不难铺排部分Bean代理即可达成,可是有四个和业务相关的位置要提示:

  • 配置processEngineConfiguration的时候属性transactionManager要接纳和作业功用的同七个事务管理Bean,不然事务不一起。

  • 对于贯彻了org.activiti.engine.delegate包中的接口的类要求被工作控制的兑现类要求被Spring代理,并且增加事务的Annotation也许在xml中配备,例如:

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

?

10. 职分代办

重重人问“Owner”属性为啥是空的,什么日期用?要打听它的成效首先要询问“代办”。

代办的概念能够用上面包车型大巴一句话归纳:

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

见状这么些单元测试你就知晓怎么是代办:ProcessTestDelegateTask

最好把activiti-study其一种类下载下来导入到Eclipse中运转一下:

原创作品,转发请注解:转载自:行事流引擎Activiti使用总计

(注: 为了表达方便, 已经简化和改动有关手续, 和点融实际操作区别)

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;每便安排1次流程定义就会添加一条数据,同名的本子号加上。

特别表达: 此能够内定差别版本的流水生产线定义,让用户多一层采纳。

2.4 同步用户数据

以此难点也是相比较多的人通晓过,Activiti帮衬对义务分配到:钦赐人、钦赐组、两者结合,而这几个人和组的音讯都保存在ACT_ID..表中,有投机的用户和组(剧中人物)管理让众几个人心慌了;原因是因为各样系统都会设有多少个权力管理模块(维护:用户、部门、角色、授权),不知底该怎么和Activiti同步。

三个好的设计不是一步到位的设计,
而是1个渐进的长河以及持续重构的进度.
可是充足关键的少数正是在一始发能够依据方今的急需以及所能预言的供给实行规划,
并且在这几个基础框架代码上支出要尤其便宜和简洁.

5.3 运行中(ProcessInstance)

简单正是没有截止的流水生产线,全部到场过的人都应当能够看到那一个实例,可是Activiti的API没有能够经过用户查询的法子,那几个只好协调用hack的办法处理了,笔者眼下还一向不处理。

从表ACT_RU_EXECUTION中询问数据。

对应的API查询:

/**
 * 获取未经完成的流程实例查询对象
 * @param userId    用户ID
 */
@Transactional(readOnly = true)
publicProcessInstanceQuery createUnFinishedProcessInstanceQuery(String userId) {
    ProcessInstanceQuery unfinishedQuery = runtimeService.createProcessInstanceQuery().processDefinitionKey(getProcessDefKey())
            .active();
    returnunfinishedQuery;
}

?

3.配置

3.
完成该工作涉及的具体步骤的操作processor类(如审查批准或和其余系统衔接,
达成实际的工作),

3.配置

6.UI及截图

结合实际业务描述三个事务从开首到完工的进度,对于迷惑的同校看完出现转机了;那里运用请假作为例子。

❸ 运行部门展开修改操

4.2 业务对象和流程关联测试

代码请转移:

9.动态内定职分办理人

由于那样一个运维管理体系关系到各样不一样的政工数据.
如借款人信息相关关系借款ID, 银行卡音信等; 如出借人新闻则涉及用户ID,
电话号码等; 而对于资本有关如提前还款则关乎到提前还款日期, 还款金额等.
所以一套支撑区别实际业务的流程数据表结构也是不行主要.

4.接纳单元测试

单元测试均使用Spring的AbstractTransactionalJUnit4SpringContextTests作为SuperClass,并且在测试类添加:

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

?

固然Activiti也提供了测试的部分超类,但是感觉不佳用,所以自个儿包装了有的格局。

代码请转移:

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

图片 9

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

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

Activiti的数据库版本的电动升级. 当大家升级activiti的版本时,
其实大家只必要立异JA锐界的本子号, 而不用关爱起底层数据库是或不是须求升级,
activiti在其表中会记录数据库scheme的本子号,
运转时会自行判断并基于要求自动更新数据库. 这也是可怜值得借鉴的地点,
尤其是当这一个模块被八个系统所利用时。

2.1 铺排流程图后汉语乱码

乱码是一贯缠绕着国人的难点,在此以前各类技术、工具出现乱码的题材写过很多篇章,那里也不例外……,Activiti的乱码难点在流程图中。

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

图片 10

化解办法有两种:

2.1.1 修改源代码方式

修改源码

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

在构造方法

public ProcessDiagramCanvas(int width, int height)

中有一行代码是安装字体的,暗许是用Arial字体,这就是乱码发生的原由,把字改为地面包车型客车粤语字体即可,例如:

?

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

理所当然假设您有安插文件读取工具那么可以安装在*.properties文件中,作者就是那般做的:

?

1
Font
font =
new
Font(PropertyFileUtil.get(
"activiti.diagram.canvas.font"),
Font.BOLD,
11);

5.12本子发轫协理设置字体名称,在外燃机中添加如下设置,在生成图片时即可使用微软雅黑安装图片中的文字。

?

1
<property
name
="activityFontName"
value
="微软雅黑"></property>

开始的场所和需求包蕴:

5.4 已完成(HistoricProcessInstance)

早就收尾的流水生产线实例。

从表ACT_HI_PROCINST中查询数据。

/**
 * 获取已经完成的流程实例查询对象
 * @param userId    用户ID
 */
@Transactional(readOnly = true)
publicHistoricProcessInstanceQuery createFinishedProcessInstanceQuery(String userId) {
    HistoricProcessInstanceQuery finishedQuery = historyService.createHistoricProcessInstanceQuery()
            .processDefinitionKey(getProcessDefKey()).finished();
    returnfinishedQuery;
}

 

?

9.3 获取流程发起人

若是在开发银行流程的时候调用了上边包车型地铁代码:

?

1
identityService.setAuthenticatedUserId(currentUserId);

引擎会记录启使人陶醉,即在ACT_HI_PROINST表的START_USER_ID字段,能够因此下边包车型地铁代码获取。

?

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

图片 11

5.2 办理中(Task)

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

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

  • 节点钦点的是具体到壹个人,而不是角色

对应的API查询:

/**
 * 获取正在处理的任务查询对象
 * @param userId    用户ID
 */
@Transactional(readOnly = true)
publicTaskQuery createTodoTaskQuery(String userId) {
    TaskQuery taskAssigneeQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey()).taskAssignee(userId);
    returntaskAssigneeQuery;
}

?

6.2 流程状态

图片 12

  1. 可以满意不相同的业务域的需要, 如出借, 借款, 资金相关的切实可行工作数据

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

8.结束

在此以前就想写这篇小说,以往算是形成了,开销了多少个钟头,希望能省去你几天的时光。

请读者仔细阅读Activiti的用户手册和Javadoc。

来自:

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;每一趟计划一回流程定义就会添加一条数据,同名的版本号加上。

专门表达: 此能够钦命差别版本的流水生产线定义,让用户多一层接纳。

在设计和促成该系统时会有

2.5.1 大家的法门

想必您会惊奇,因为我们从未利用Activiti
Modeler,大家觉得用Viso已经能发挥流程图的意趣了,而且项目老董也是技巧出身,和开发职员也简单交换。

当下以此类型是率先个应用Activiti的,开头大家在必要调查商量阶段选取Viso设计流程图,利用泳道流程图规划和客户关系,鲜明后由负责流程的开发职员用Eclipse
Designer设计赢得bpmn20.xml,最终安顿。

2.2.2 自定义业务Form

那种形式应该是豪门用的最多的了,因为一般的作业系统工作逻辑都会比较复杂,而且数据库中有的是表都会有依靠关系,表单中有无数状态判断。

譬如说大家的连串适用jQuery
UI作为UI,有不少javascript代码,页面包车型大巴累累操作必要新鲜处理(例如:四个选用的排斥、每一种节点依据项目和操作人展现差异的按钮);基本每一个公司都有一套本人的UI风格,要保全八个系统的操作习惯一致只可以选用自定义表单才能满意。

➤ WorkflowService对工作流引擎的包裹

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

1.3 Activiti资料

  • 官网:

  • 下载:

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

  • Eclipse Plugin: 

  • Activit中文群:236540304

主要编辑:

6.2 流程状态

图片 13

6.3 流程跟踪

图表格局体现当前节点:

图片 14

列表情势显得流程流转进程:

图片 15

提倡流程的首要性缘由是用户期待依照合同进行提前还款. 流程关键步骤为:

1.3 Activiti资料

  • 官网:

  • 下载:

  • 本子:Activiti的版本是从5开始的,因为Activiti是使用jBPM4的源码;本子公布:五个月宣布二遍。

  • Eclipse Plugin: 

  • Activit中文群:5435716

5.各个场所包车型大巴天职查询以及和作业对象关系

大家脚下分为4中状态:未签收、办理中、运维中、已做到。

查询到职分依旧流程实例后要展现在页面,这几个时候供给添加业务数据,最后结果便是工作和流程的并集,请参考6.2

数据库设计

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

代码请转移:

➤可配置化的基于业务种类(Request Type)
和安排(process_cfg)在运作时动态设置流程相应的处理人/组

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

不止的重构包含:

1.不难介工作流引擎与Activiti

对此工作流引擎的表明请参考百度宏观:工作流引擎

基础框架代码设计

9.2 自动安装职分办理人

下边包车型客车代码是选择initiator功效,设置三个称号(不是变量而是变量名)到运维事件上,并且在起步流程时调用一些上边包车型地铁章程:

?

1
identityService.setAuthenticatedUserId(currentUserId);

中间currentUserId表示如今用户,也正是开发银行流程的人,配置如下所示:

?

1
2
<startevent
id
="startevent1"
name
="Start"
activiti:initiator
="applyUserId"></startevent>
<usertask
id
="reportBack"
name
="销假"
activiti:assignee
="${applyUserId}"></usertask>

那般流程运转之后假使任务流转至”销毁假冒货物”节点则会活动把任务分配给运转流程的人。

➤ 遵照业务须求提供ASync的processor处理基类, 因为其实使用中发现,
一些作业的处理(如批量)要求一段时间的实行才能不负众望,
而异步处理基类则达成基础达成, 并由相应子类去贯彻虚函数即可.

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

别人的系统是何等贯彻的?

❷ 申请提交系统后, 由风控进行核对

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

◆✦以下对第1 、三点实行实行✦◆

☞ 基础框架代码的设计

为了化解 #2 的题材,
则须求用服务实行包装, 抽象出部分接口以及基类的实 现, 并
应用有的大面积的设计格局(工厂情势)和java的表征(反射).

公共化学工业作流模块:

❺ 生成还款结清注解

◆✦上边为四个特出的业务流程✦◆

❸ 借款人确认, 通过客服服务人口上传签字照片

对于互连网金融平台来说,首要的政工愈发是涉嫌资本工作相关操作时都有必不可少有连锁的审查批准流程.同时在工艺流程的萍踪浪迹进程中需求和顺序业务系统开始展览交互,完毕真正的事务处理,
并记录那几个历程中全体人的操作以及每一步操作时所关联数量快速照相,以便于内外部审计和题材的追溯.

下图为主干的架构划设想计

图片 16

原标题:基于工作流的平台管理体系规划

对此二个好像涉及到审查批准以及履行实际事情的种类, 基于简单的景况控制的安顿性,
或许电动开发类工作流引擎轮子的做法都以不合适.
所以3个开源并且被广大应用的行事流引擎是贰个不错而且必须的选取. Activiti
工作流引擎由于其轻量级, 易用性等优点近日在产业界被大规模使用.
其工作流的状态机和表面系统的连日只需求经过三个ID进行关联即可,
即activiti的business key. (如下图)

为此, 基于具体的事务开始展览数据表的设计是不相宜的, 且不能够扩展.
常见的宏图为依据Key-Value的宏图,
而key则是各种分裂工作系统涉及到的metadata. 如USE本田CR-V_ID(用户ID),
LOAN_ID(借款ID)等等. 设计概述如下:

一. 借款人银行卡音信修改

在凉台的实际运营中, 有丰裕多采的事体须求处理, 包括借款人, 出借人,
资金等等, 同时还涉及到种种分化的业务部门,
而且流程的流浪操作人士和机构也乘机公司业务的提高而分裂的调整.
设计3个基础的流程框架和促成基础代码, 形成简单的费用格局是该系统的重大.
因而总体种类的布署性涉及到以下重点多少个方面:

图片 17重临天涯论坛,查看越多

➤将各类处理类(业务处理类, 流程处理人/组分配处理类, 通告处理类)
通过RegisterService的集合登记管理,
并且帮助选拔对于特定的流水生产线完结特定的拍卖类来替代私下认可的拍卖类

借鉴Activiti的源代码

相关文章