该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-14
这篇文章是受一名QQ昵称为“老结赖”的朋友的托付写的,希望可以帮到他。 言归正传,在JBPM中是通过Actor和PooledActor来对任务进行授权的。其中也牵涉到了Swimlane的概念(具体概念会在另一片文章中说明)。由于在JBPM中并没有把Task的授权强行跟Actor和PooledActor进行关联,这也就让我们嵌入自己的用户模型成为了可能。 废话少说,先给出一个示例流程: <?xml version="1.0" encoding="UTF-8"?> <process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="资金归集"> <start-state name="启动"> <transition name="" to="制单"></transition> </start-state> <task-node name="制单"> <task name="制单"> <assignment actor-id="#{processStarter}"></assignment> </task> <transition name="送复核" to="复核"></transition> </task-node> <task-node name="复核"> <task name="复核"> <assignment class="com.sky.plugin.jbpm.def.ActorsHandel"> </assignment> </task> <transition name="拒绝复核" to="制单"></transition> <transition name="提交审批" to="审批"></transition> </task-node> <task-node name="审批"> <task name="审批"> <assignment class="com.sky.plugin.jbpm.def.ActorsHandel"> </assignment> </task> <transition name="同意" to="结束"> <transition name="拒绝到复核人" to="复核"></transition> </task-node> <end-state name="结束"></end-state> </process-definition> 其中有几点地方是我们要注意到的,也就是我们实现自定义用户模型需要做到的地方。在这里先提一下,然后再一一解释。 1. <assignment actor-id="#{processStarter}"></assignment> 确定流程的发起者 2. <assignment class="com.sky.plugin.jbpm.def.ActorsHandel"> 通过AssignHandler动态的对流程实例定义Actor 流程中,通过一个变量#{processStarter}来对整个流程的第一个Task进行授权,那么这个授权是在启动流程的时候一起进行的。也就是说这个#{processStarter}的值应该是系统中启动流程的当前用户。 启动流程代码如下: public Long startProcess(final Long processDefinitionId, final String username) { return (Long)jbpmTemplate.execute(new JbpmCallback() { public Object doInJbpm(JbpmContext jbpmContext) throws JbpmException { GraphSession graphSession = jbpmContext.getGraphSession(); ProcessDefinition processDefinition = graphSession .loadProcessDefinition(processDefinitionId); ProcessInstance processInstance = new ProcessInstance( processDefinition); //设置流程发起人 processInstance.getContextInstance().setVariable("processStarter",username); processInstance.signal(); TaskInstance taskInstance = (TaskInstance) processInstance .getTaskMgmtInstance().getTaskInstances().iterator() .next(); taskInstance.setActorId(username); taskInstance.setVariable("processStarter",username); // taskInstance.end(); // Save the process instance along with the task instance jbpmContext.save(processInstance); return processInstance.getId(); } }); } 注:其中processInstance.getContextInstance().setVariable("processStarter",username);则是把系统当前用户设置到流程中。这里有一点跟别的地方不一样的地方,那就是这个流程没有<startTask></startTask>,而是用一个TaskNode作为startTask,这里是由于我的系统中有特殊的要求。如果你不需要的话,你可以用startTask代替,都是一样的处理。 接着,进入最关键的部分,也就是真正实现Task的用户可配置,这样的话,需要额外的维护一张Task和自定义用户模型中user的映射表。 映射表结构如下: id---processDefinitionId---taskId---taskName---actors 1----------1--------------------------1--------制单--------1001 2----------1--------------------------2--------复核--------1002,1003 3----------1--------------------------3--------审批--------1004,1005,1006 其它字段的意思就不用说了,其中actors字段就是你用户模型中的用户名或者userId。[b当然这里是很灵活的,如果你要和你系统中的Role绑定,也同样可以这样实现,只要变通一点就OK了,这里就不罗嗦了。 下面进入最重要的部分,也就是通过AssignHandler进行动态授权。代码如下: package com.sky.plugin.jbpm.def; public class ActorsHandel implements AssignmentHandler { private static final long serialVersionUID = 1L; public void assign(Assignable assignable, ExecutionContext context) throws Exception { ProcessDefinition processDefinition = context.getProcessDefinition(); TaskInstance taskInstance = context.getTaskInstance(); Task task = taskInstance.getTask(); Long processDefinitionId = processDefinition.getId(); Long taskId = task.getId(); //读取数据库该任务的授权,分配给该任务Task,也就是前面那张表中的记录 //ps.loadTaskActors(processDefinitionId, taskId)是自定义方法用来读取 //授权信息 ServiceFactory serviceFactory = ServiceFactory.getInstance(); ProcessService ps = serviceFactory.getProcessService(); String[] actors = ps.loadTaskActors(processDefinitionId, taskId); assignable.setPooledActors(actors); } } 这样就完成了Jbpm同自定义用户模型的绑定,以后就是处理Task了,但是这里只是简单的实现,还有很多的东西需要注意。比如:流程被打回(审批不通过),只能回到前一个提交的人那里,而不是第一次流程定义的所有的actors等等问题。这个问题我将在“JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(2)”中进行说明。 “老结赖”,这篇我冒生命危险,花了1个小时的上班时间写的东东希望可以帮到你。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-11-14
你写的文章对我帮助很大,同时请教一个问题,你用的数据库是mysql么,如何正确处理流程定义中的中文,如何配置?谢谢。
我也是深圳的。 |
|
返回顶楼 | |
发表时间:2006-11-15
你的这个问题应该是数据库处理中文的问题,跟JBPM本身的关系不是很大,我用的是MSSQLServer没有问题,所以我暂时也不知道怎么弄。HOHO!
|
|
返回顶楼 | |
发表时间:2006-11-15
|
|
返回顶楼 | |
发表时间:2007-01-25
ServiceFactory serviceFactory = ServiceFactory.getInstance();
这个ServiceFactory是那个包里的啊?jbpm3.1.2没有这种用法啊 |
|
返回顶楼 | |
发表时间:2007-01-28
你在哪工作亚,写文章是要冒生命危险的呀,,同情。。。
|
|
返回顶楼 | |
发表时间:2007-01-29
差沙 写道 你在哪工作亚,写文章是要冒生命危险的呀,,同情。。。
生命诚可贵 精华价更高 若为分享固 两者皆可抛 |
|
返回顶楼 | |
发表时间:2007-01-29
一直对这方面不了解
感谢楼主分享! |
|
返回顶楼 | |
发表时间:2007-02-07
十分期待
"JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(2)" 的推出,呵呵 |
|
返回顶楼 | |
发表时间:2007-04-27
在项目中大家好像都是这么做的吧
|
|
返回顶楼 | |