依据职业流的阳台管理种类规划

☞设计通用的尾部数据来援救分裂的事情

二.陆 Eclipse Designer存在的主题材料

以此插件有三个很厌恶的Bug平昔未修复,安装了插件后Eclipse的复制和粘帖迅速键会被改造为(Ctrl+Insert、Shift+Insert);Bug描述请见:

  • Activit
    Forums中报告的Bug

  • Jira的登记

从而最终我们只能单独开三个安装了Eclipse
Designer的Eclipse专门用来布署流程图,那样就不影响健康使用Eclipse
JAVAEE了。

玖.叁 获取流程发起人

假设在起步流程的时候调用了上边包车型大巴代码:

?

1
identityService.setAuthenticatedUserId(currentUserId);

引擎会记录启迷人,即在ACT_HI_PROINST表的START_USER_ID字段,能够通过上边的代码获取。

?

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

九.三 获取流程发起人

壹旦在运行流程的时候调用了下边的代码:

?

1
identityService.setAuthenticatedUserId(currentUserId);

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

?

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

提倡流程的首要缘由是用户愿意根据合同进行提前还款. 流程关键步骤为:

二.5.1 大家的办法

恐怕您会惊讶,因为大家从未运用Activiti
Modeler,大家感觉用Viso已经能宣布流程图的情趣了,而且项目主管也是才具出身,和开荒人士也便于沟通。

眼前这一个体系是首先个使用Activiti的,起首大家在急需应用钻探阶段选用Viso设计流程图,利用泳道流程图安排和客户联系,明确后由担任流程的开采职员用Eclipse
Designer设计赢得bpmn20.xml,最后布置。

1.2 Activiti与JBPM5?

对此Activiti、jBPM四、jBPM⑤大家理应怎样挑选,在InfoQ上有一篇小说写的很好,从大的范畴相比各种引擎之间的反差,请参见文章:纵观jBPM:从jBPM3到jBPM5以及Activiti5

7.开启Logger

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

☞ 选取适合的干活流引擎

陆.贰 流程状态

图片 1

九.动态内定职务办理人

➤可配置化的基于业务项目(Request Type)
和布置(process_cfg)在运作时动态设置流程相应的管理人/组

3.1 集成Spring

对此和Spring的集成Activiti做的不利,轻巧安插部分Bean代理就可以兑现,可是有八个和作业相关的地点要升迁:

  • 配置processEngineConfiguration的时候属性transactionManager要使用和作业成效的同2个事务管理Bean,不然事务差别台。

  • 对于贯彻了org.activiti.engine.delegate包中的接口的类必要被专门的工作调控的得以完毕类须要被Spring代理,并且增加事务的Annotation或许在xml中配备,举例:

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

?

6.贰 流程状态

图片 2

二.5.1 大家的主意

可能你会欣喜,因为我们并未有行使Activiti
Modeler,大家认为用Viso已经能公布流程图的意味了,而且项目高管也是才干出身,和开拓职员也便于交流。

脚下那么些种类是首先个使用Activiti的,开首我们在需求科研阶段采纳Viso设计流程图,利用泳道流程图陈设和客户联系,分明后由担任流程的开垦人士用Eclipse
Designer设计赢得bpmn20.xml,最终布置。

借鉴Activiti的源代码

二.发轫使用遭受题目搜聚

因为Activiti刚刚退出不久所以资料相比空缺,汉语资料更少的可怜,所以初叶的时候二只雾水(即使事先用过专门的工作流,可是以为距离繁多),而且官方的手册还不是很周密;所以自身把笔者在求学使用的进度境遇的片段疑难都位列出来分享给大家;以下几点是自己遇上和想到的,假若你还有哪些难点能够在冲突仲春自个儿沟通再补偿。

6.UI及截图

结合实际业务描述叁个政工从发轫到甘休的进程,对于吸引的同窗看完峰回路转了;这里运用请假作为例子。

二.6 Eclipse Designer存在的标题

本条插件有五个很厌恶的Bug向来未修复,安装了插件后Eclipse的复制和粘帖快速键会被调换为(Ctrl+Insert、Shift+Insert);Bug描述请见:

  • Activit
    Forums中告诉的Bug

  • Jira的登记

据此最后我们只能单独开二个安装了Eclipse
Designer的Eclipse专门用来布署流程图,那样就不影响健康使用Eclipse
JAVAEE了。

☞ 基础框架代码的安插性

陆.1 单独3个列表肩负申请

这样的裨益是报名和流程办理分离开管理,列表展现未运维流程的请假记录(数据库PROCESS_INSTANCE_ID为空)。

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

图片 3

5.2 办理中(Task)

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

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

  • 节点钦赐的是现实到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;
}

5.5 查询时和事情涉嫌

提示:从前在作业对象增多了PROCESS_INSTANCE_ID字段

思路:未来得以应用这些字段查询了,不管是Task依然ProcessInstance都得以博得流程实例ID,能够依靠流程实例ID查询实体然后把流程对象设置到实体的一个脾气中由Action恐怕Controller输出到前台。

代码请参见:

故此, 基于现实的政工拓展数据表的安插是不安妥的, 且无法扩展.
常见的策画为依照Key-Value的图谋,
而key则是逐1区别专门的学问系统涉及到的metadata. 如USEBMWX三_ID(用户ID),
LOAN_ID(借款ID)等等. 设计概述如下:

二.1.二.二 使用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>

如此当修改流程定义文件后1旦运营ant命令就足以打包了:

ant workflow.package.oa.leave

未来铺排bar或然zip文件查看流程图图片就不是乱码了,而是你的压缩包里面包车型客车png文件。

二.四.壹 建议管理情势

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维护,分明要规定1方,然后CRUD的时候共同到对方,若是急需一齐八个子系统那么能够再调用WebService达成。

四.1 验证流程图设计是还是不是科学

代码请转移:

数据库设计

四.贰 业务对象和流程关联测试

代码请转移:

2.二.一 引擎提供的Form

概念表单的不二秘籍在各类Task标签中定义extensionElementsactiviti:formProperty就可以,达到那一个节点的时候能够由此API读取表单成分。

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

不过这种艺术唯有适用于相比较轻易的流程,对于有个别复杂或然页面需求职业逻辑的判别的事态就不适用了。

对于数据的保存都以在电动机的表中,不便于和别的表的涉嫌、对全体系统的统筹也不利于!

8.结束

前边就想写那篇小说,今后毕竟完毕了,开支了几个钟头,希望能节约你几天的时刻。

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

假使有何难题照旧对于功用的落成有更加好的艺术招待提议、分享。

➤ 近日, 别的3个项目其选取到的情景和这一个系统有类似之处,
其单独于该业务管理平台. 在那种景色下, 将该职业流相关的模块举办公共化,
以JA中华V包的格局提供, 使得别的一个连串的支出能够长时间内达到平等的效用

5.2 办理中(Task)

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

  • 签收后的,5.1中签收后就活该为办理中状态

  • 节点钦定的是切实可行到壹位,而不是剧中人物

对应的API查询:

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

?

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

一.一 笔者与做事流引擎

在首先家市肆做事的时候根本职务便是开辟OA系统,当然基本都以有职业流的支撑,可是当下应用的专业流引擎是协作社部分牛人开辟的(听说是用3个开源的引擎修改的),名字为CoreFlow;成效相对Activiti来讲比较弱,可是能满意平常的应用,当然也有无数的标题由此后来大家不得不修改引擎的代码打补丁。

方今是本人职业的第三家市廛,因为要开采ERP、OA等种类必要使用职业流,在品种应用探讨阶段本人先找找资料接纳选用哪个开源行事流引擎,最后明确了Activiti五并基于厂商的架构做了一部分DEMO。

◆✦以下对第二、叁点开始展览实行✦◆

2.二.二 自定义业务Form

这种措施应该是大家用的最多的了,因为一般的事务种类业务逻辑都会相比复杂,而且数据库中许多表都会有依赖关系,表单中有广大意况剖断。

譬如说我们的体系适用jQuery
UI作为UI,有过多javascript代码,页面的多数操作必要独特管理(比如:多少个采纳的排斥、每一种节点依照项目和操作人展现不一致的开关);基本各类集团都有一套自身的UI风格,要保全三个系统的操作习贯1致只好采纳自定义表单才具满意。

玖.一 手动设置职务办理人

?

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

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


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

variables.put(“hrUserId”, hrUserId);

taskService.complete(taskId, variables);


2.二.1 引擎提供的Form

概念表单的办法在各类Task标签中定义extensionElementsactiviti:formProperty就可以,到达那个节点的时候能够通过API读取表单成分。

Activiti官方的例证使用的正是在工艺流程定义中安装每一种节点呈现怎么的表单哪些字段须求体现、哪些字段只读、哪些字段必填。

只是那种艺术只有适用于相比较简单的流水生产线,对于某个复杂也许页面须求专门的学业逻辑的推断的事态就不适用了。

对此数据的保存都以在斯特林发动机的表中,不便宜和其余表的关联、对1切系统的统一希图也不利于!

三.
兑现该事务关系的具体步骤的操作processor类(如审查批准或和别的系统对接,
落成实际的作业),

四.利用单元测试

单元测试均采用Spring的AbstractTransactionalJUnit四SpringContextTests作为SuperClass,并且在测试类增多:

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

?

就算如此Activiti也提供了测试的部分超类,但是认为倒霉用,所以自身包裹了有的办法。

代码请转移:

二.四 同步用户数据

本条难题也是相比较多的人询问过,Activiti补助对任务分配到:内定人、钦点组、两者结合,而那么些人和组的音讯都保存在ACT_ID..表中,有自身的用户和组(剧中人物)管理让很几个人心惊肉跳了;原因是因为各种系统都会设有1个权力管理模块(维护:用户、部门、剧中人物、授权),不晓得该怎么和Activiti同步。

6.UI及截图

结合实际业务描述三个思想政治工作从起先到结束的进程,对于吸引的同室看完柳暗花明了;那里运用请假作为例子。

Activiti中提供便捷的查询类, 如: ProcessInstanceQuery, TaskQuery.
其同时支持依据Process和Task相应的属性数据进行查询,
和Request/Snapshot以及property有不小的相似之处,
借鉴并依据真实景况兑现团结的RequestQuery类, 帮衬各样复杂查询, 如:
依照内定的property的name和value查询, 辅助or的查询等。

1.1 作者与职业流引擎

在第2家商家职业的时候根本职分就是开辟OA系统,当然基本都以有职业流的援助,不过当下选取的干活流引擎是商场部分牛人开拓的(听闻是用3个开源的斯特林发动机械修理改的),名叫CoreFlow;功效相对Activiti来讲比较弱,不过能满意普通的利用,当然也有不少的主题材料由此后来我们只可以修改引擎的代码打补丁。

当今是自家职业的第二家同盟社,因为要开拓ERP、OA等系统须要动用专门的学问流,在档期的顺序科学商量阶段本身先找找资料采取使用哪个开源办事流引擎,最后分明了Activiti5并根据厂家的架构做了部分DEMO。

陆.叁.1 当前节点定位JS

Java代码请移步:

Javascript思路:先通过Ajax获取当前节点的坐标,在钦赐地方加多黑褐边框,然后加载图片。

代码移步:

6.3 流程追踪

图表情势展现当前节点:

图片 4

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

图片 5

对此2个看似涉及到审批以及实行实际业务的类别, 基于轻松的图景调节的安排,
可能电动开垦类工作流引擎轮子的做法都以不合适.
所以2个开源并且被大面积使用的专门的学问流引擎是贰个科学而且必须的选用. Activiti
工作流引擎由于其轻量级, 易用性等优点目前在产业界被普及使用.
其职业流的状态机和外部系统的连年只必要经过2个ID实行关联就可以,
即activiti的business key. (如下图)

8.结束

前边就想写那篇小说,未来总算达成了,花费了多少个小时,希望能节约你几天的年华。

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

来自:

二.一.一 修改源代码格局

修改源码

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

在构造方法

public ProcessDiagramCanvas(int width, int height)

中有1行代码是设置字体的,暗中认可是用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>
贰.一.2.一 使用工具打包Bar文件

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

➤ WorkflowService对职业流引擎的卷入

二.四.壹 建议管理格局

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维护,确定要规定1方,然后CRUD的时候共同到对方,假使急需一同多少个子系统那么能够再调用WebService落成。

玖.二 自动安装职务办理人

下边包车型地铁代码是接纳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>

诸如此类流程运营现在假设任务流转至”销毁假冒货物”节点则会自行把职务分配给运营流程的人。

1.3 Activiti资料

  • 官网:

  • 下载:

  • 本子:Activiti的版本是从5开始的,因为Activiti是使用jBPM4的源码;本子公布:四个月发布2次。

  • Eclipse Plugin: 

  • Activit中文群:236540304

如上所说, 那样的二个数额布置必须能够满意:

二.4 同步用户数量

以此主题素材也是相比较多的人精晓过,Activiti帮衬对任务分配到:钦点人、内定组、两者结合,而那么些人和组的音信都保存在ACT_ID..表中,有投机的用户和组(剧中人物)管理让众多少人仓惶了;原因是因为各种系统都会存在二个权力管理模块(维护:用户、部门、剧中人物、授权),不知底该怎么和Activiti同步。

四.应用单元测试

单元测试均运用Spring的AbstractTransactionalJUnit四SpringContextTests作为SuperClass,并且在测试类加多:

?

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

就算Activiti也提供了测试的一些超类,但是认为倒霉用,所以自个儿包装了有的方法。

代码请转移:

4.选取单元测试

单元测试均选取Spring的AbstractTransactionalJUnit4SpringContextTests作为SuperClass,并且在测试类增添:

?

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

虽说Activiti也提供了测试的有个别超类,可是以为倒霉用,所以本身包裹了有的格局。

代码请转移:

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

二.五 流程图设计工具用哪些

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

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

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

陆.3 流程追踪

图片格局呈现当前节点:

图片 4

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

图片 5

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

听别人说那样的框架产生基础代码后,
最后对于多个落成具体育赛事情的开荒职员来讲, 其实现一个业务流程代码重要不外乎:

二.一.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);

8.结束

事先就想写那篇小说,未来总算不负众望了,花费了多少个钟头,希望能节省你几天的时辰。

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

假若有何样疑难照旧对于效率的贯彻有越来越好的章程应接提议、分享。

九.贰 自动安装职务办理人

上面包车型大巴代码是使用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>

那般流程运转未来即使职责流转至”销毁伪劣产品”节点则会自行把职务分配给运行流程的人。

相关文章

发表评论

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

*
*
Website