在官方发布的 jbpm.jar 的根路径中包含了一些默认提供的配置文件 。 我们可以选择包含或排除某些功能,通过在 jbpm.cfg.xml 配置文件中导入需要的配置文件。
配置文件 | 说明 |
---|---|
jbpm.default.cfg.xml | 主配置。 |
jbpm.identity.cfg.xml | 身份认证。 |
jbpm.jbossremote.cfg.xml | 基于 JBoss 应用服务器实现分布式远程调用。 |
jbpm.jobexecutor.cfg.xml | Job 执行器配置,用于配置异步活动和定时器 Job 的执行策略。 |
jbpm.task.lifecycle.cfg.xml | 任务声明周期状态定义配置,状态有这些:开启(open)、挂起(suspended)、取消(cancelled)、完成(completed)。 |
jbpm.tx.hibernate.cfg.xml、jbpm.tx.jta.cfg.xml、jbpm.tx.spring.cfg.xml | Hibernate 事务 、JTA 事务和 Spring 事务配置。 |
jbpm.variable.types.xml | 流程变量数据类型映射配置。 |
jbpm.wire.bindings.xml、jbpm.jpdl.bindings.xml | 基于 jBPM4 的 IoC 架构,通过依赖注入将引擎组件绑定到运行环境中。 |
jbpm.businesscalendar.cfg.xml | 工作日历配置。 |
1 典型配置
一个典型的 jBPM4 的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<jbpm-configuration>
<import resource="jbpm.default.cfg.xml" />
<import resource="jbpm.businesscalendar.cfg.xml" />
<import resource="jbpm.tx.hibernate.cfg.xml" />
<import resource="jbpm.jpdl.cfg.xml" />
<import resource="jbpm.bpmn.cfg.xml" />
<import resource="jbpm.identity.cfg.xml" />
<!-- Job executor is excluded for running the example test cases. -->
<!-- To enable timers and messages in production use, this should be included. -->
<!--
<import resource="jbpm.jobexecutor.cfg.xml" />
-->
</jbpm-configuration>
jbpm.default.cfg.xml 中包含了关键配置,如 Service:
<repository-service />
<repository-cache />
<execution-service />
<history-service />
<management-service />
<identity-service />
<task-service />
如果需要在 JTA 环境下运行 jBPM4,那么可以把 jbpm.tx.hibernate.cfg.xml 替换为 jbpm.tx.jta.cfg.xml。
默认采用 Hibernate 来管理事务,在 jbpm.tx.hibernate.cfg.xml 中引用了 jbpm.hibernate.cfg.xml:
<hibernate-configuration>
<cfg resource="jbpm.hibernate.cfg.xml" />
</hibernate-configuration>
jbpm.hibernate.cfg.xml 负责指定 jBPM4 的实体映射关系:
<mapping resource="jbpm.repository.hbm.xml" />
<mapping resource="jbpm.execution.hbm.xml" />
<mapping resource="jbpm.history.hbm.xml" />
<mapping resource="jbpm.task.hbm.xml" />
<mapping resource="jbpm.identity.hbm.xml" />
2 定制工作日历
可以修改 jbpm.businesscalendar.cfg.xml,来自定义我们所需要的工作日历:
<business-calendar>
<monday hours="9:00-12:00 and 12:30-17:00"/>
<tuesday hours="9:00-12:00 and 12:30-17:00"/>
<wednesday hours="9:00-12:00 and 12:30-17:00"/>
<thursday hours="9:00-12:00 and 12:30-17:00"/>
<friday hours="9:00-12:00 and 12:30-17:00"/>
<holiday period="01/07/2008 - 31/08/2008"/>
</business-calendar>
3 定制身份认证
JBPM4 提供了两套身份认证组件:
- IdentitySessionImpl - 默认。
- JBossIdmIdentitySessionImpl -基于 JBoss 应用服务器 IDM。
定制身份认证组件的步骤:
- 删除 jbpm.cfg.xml 中的 jbpm.identity.cfg.xml 配置。
- 加入以下配置:
<transaction-context>
<object class="net.deniro.jbpm.java.identity.CustomIdentitySession"/>
</transaction-context>
CustomIdentitySession 需要实现 IdentitySession 接口,它包含以下这些方法:
方法 | 说明 |
---|---|
String createUser(String userId, String givenName, String familyName, String businessEmail) | 创建用户。 |
User findUserById(String userId) | 根据用户 ID 获取用户。 |
List<User> findUsersById(String... userIds) | 根据用户 ID 组获取用户列表。 |
List<User> findUsers() | 获取所有用户。 |
void deleteUser(String userId) | 删除用户。 |
String createGroup(String groupName, String groupType, String parentGroupId) | 创建用户组,返回用户 ID。 |
List<User> findUsersByGroup(String groupId) | 根据组 ID,获取组内的用户列表。 |
Group findGroupById(String groupId) | 根据组 ID,获取组对象。 |
List<Group> findGroupsByUserAndGroupType(String userId, String groupType) | 根据用户 ID 与组类型,获取组列表。 |
List<Group> findGroupsByUser(String userId) | 根据用户 ID 获取其所属的组列表。 |
void deleteGroup(String groupId) | 删除组。 |
void createMembership(String userId, String groupId, String role) | 关联用户与组,角色属性为可选。 |
void deleteMembership(String userId, String groupId, String role) | 删除用户与组之间的关系。 |
接着实现自定义的 User (org.jbpm.api.identity.User)与 Group (org.jbpm.api.identity.Group)接口。
User 接口方法:
方法 | 说明 |
---|---|
String getId() | 获取用户 ID。 |
String getGivenName() | 获取用户名字。 |
String getFamilyName() | 获取用户姓氏。 |
String getBusinessEmail() | 获取用户电子邮件。 |
Group 接口方法:
方法 | 说明 |
---|---|
String getId() | 获取组 ID。 |
String getName() | 获取组名称。 |
String getType() | 获取组类别。 |
一个用户可以属于多个组。
User 接口与 Group 接口符合组织模型的最小化定义,我们可以根据业务需求来扩展这两个接口。
比如,我们可以自定义一个新的 CustomUser 接口来继承 User 接口,加入以下方法:
方法 | 说明 |
---|---|
String getAddress() | 获取用户地址。 |
User getLeader() | 获取用户的直属上级。 |
自定义一个新的 CustomGroup 接口来继承 Group 接口,加入以下方法:
方法 | 说明 |
---|---|
String getDesc() | 获取组描述。 |
Group getSuperGroup() | 获取上级部门(假设组被视为组织结构的部门) |
通过扩展,我们就可以基于业务需求,来重建整个组织权限系统的持久化层啦O(∩_∩)O哈哈~