在现有的应用上,接入jBPM,要修改的就是jBPM的用户体系。
jBPM的用户体系,在数据库中有以下几张表:
JBPM4_ID_USER : jBPM的用户表
JBPM4_ID_GROUP : jBPM的用户组表
JBPM4_MEMBERSHIP : 用户和用户组之间的关系
JBPM4_TASK : 任务表,其中的assignee_表示这个任务有谁来完成
JBPM4_PARTICIPATION : 可选的用户或者用户组,一个任务可以有一些用户/用户组中的成员来完成,记录在这个表中
JBPM4_SWIMLANE :泳道,现在还未仔细的看
-----------------------------------------------------------
jBPM4对外服务的时候,和用户、用户组相关的服务,都有IdentityService来进行(具体有IdentityServiceImpl来实现)。
通过Command模式,交由下层来进行具体的实现
具体的实现都是交给接口IdentitySession来进行的,
具体的实现有2个:IdentitySessionImpl,JBossIdmIdentitySessionImpl。
现在自己程序中,一般都有IdentitySessionImpl来进行处理。
-----------------------------------------------------------------
接入到自己的系统:
一般情况下,如果在自己的系统中,明确的每个任务都是由指定的人员来完成,或者在进入Task的时候,在AssignmentHandler中能够直接确定工作者,就不需要修改jBPM了。
如果需要使用到jBPM的taskService的findGroupTasks,或者需要通过jBPM的自动发邮件的功能,则需要对jBPM做一些修改,将jBPM获取用户的方式转接到自己的系统来。
现在考虑具体的实现,就是更换掉jBPM的 IdentitySessionImpl,用自己原有的方式来替换它。
----- 原来考虑替换 IdentityServiceImpl,看了一下jBPM内部的一些代码,发现在pvm中,有地方是直接获取IdentitySession的,所以替换IdentityServiceImpl不能实现要求。
获取接口IdentitySession,通过以下方式来的:
EnvironmentImpl.getFromcurrent(IdentitySession.class)
或者是:
environment.get(IdentitySession.class)
EnvironmentImpl 是保存在 ThreadLocal中的,
------------------------------------------------------------------------------------------------------------
jBPM4的IoC的方式见:以下链接:
http://www.opug.org.cn/node/87 或
http://www.iteye.com/topic/381607
Jbpm4透过WireParser具备从xml加载的能力,wire的相关配置文件为:jbpm.wire.bindings.xml,其中包含了对IdentitySession的定义:
<binding class="org.jbpm.pvm.internal.wire.binding.IdentitySessionBinding" />
在jBPM4中,缺省的是绑定:org.jbpm.pvm.internal.wire.binding.IdentitySessionBinding
public Object parse(Element element, Parse parse, Parser parser) { ObjectDescriptor objectDescriptor = new ObjectDescriptor(IdentitySessionImpl.class); objectDescriptor.addTypedInjection("session", Session.class); return objectDescriptor; }
IdentitySession的实现是: IdentitySessionImpl.class
同时给该类的session属性,注入Session.class
public class IdentitySessionImpl implements IdentitySession { protected Session session;
如果要替换,只要自己继承IdentitySession,实现一个其功能的类。
同时自己在完成一个binding类,修改jBPM的配置即可。
---------
在identitySession中,使用到User和group接口(都在org.jbpm.api.identity),而且这个接口相对简单,如果自己要使用,可以在几个基础上再进行继承。
别人的文章: