在JBPM中定义了一个简单的?Role-〉User的用户模型。但是在实际项目中,我们的用户模型可能远比这个模型复杂,或者有很大的差异。所以也就有了这篇文章的主题。
这篇文章是受一名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个小时的上班时间写的东东希望可以帮到你。
分享到:
- 2006-11-14 10:38
- 浏览 16587
- 评论(12)
- 论坛回复 / 浏览 (12 / 28266)
- 查看更多
相关推荐
JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权的实现代码和数据结构
jbpm开发指南 jbpm开发指南 jbpm 工作流 自定义
jbpm4表结构模型jbpm4表结构模型jbpm4表结构模型jbpm4表结构模型
jbpm的开发手册与用户指南 jbpm的开发手册与用户指南
JBPM4 PVM的流程定义模型与过程调度
jbpm3,jbpm4用户文档,开发指南,jbpm4解读,jbpm学习笔记,jbpm最佳实践全套套
中文版JBPM5用户指南 JBPM5 JBPM5教程
JBPM4.3用户手册JBPM4.3用户手册JBPM4.3用户手册
NULL 博文链接:https://openstudy.iteye.com/blog/998134
jbpm4.4开发指南,jbpm4.4用户指南
通过查看JBPM的表,我们知道要实现流程监控功能就是把JBPM当中的JBPM_PROCESSDEFINITION(已发布的流程表),JBPM_PROCESSINSTANCE(流程实例表),JBPM_TASKINSTANCE(流程产生的任务实例表)这三张表串联起来就可以...
jbpm中文用户指南,涵盖jbpm所有内容!
jBPM 4.4用户手册 翻译官方文档 JBoss jBPM Teams 4.4 译者: Lingo 首页: http://www.family168.com/ 论坛: http://old.family168.com/bbs EMAIL: lingosurf168@gmail.com 2009年11月1日 1. 导言 1.1. 许可...
jBPM 4.4 用户手册 中文版 PDF格式
使用JBoss jBPM实现流程访问和执行的授权
jbpm+S2SH请假流程经典实现及源码
jBPM_用户开发手册
jbpm教程+中文用户指南
jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍
jbpm 用户指南 帮助文档 工作流 jbpm 用户指南 帮助文档 工作流 jbpm 用户指南 帮助文档 工作流 jbpm 用户指南 帮助文档 工作流jbpm 用户指南 帮助文档 工作流 jbpm 用户指南 帮助文档 工作流