`
tomkoo
  • 浏览: 186072 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(1)

    博客分类:
  • JBPM
阅读更多
在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个小时的上班时间写的东东希望可以帮到你。
分享到:
评论
12 楼 cun2001 2007-09-14  
自定义的表可以在后台由管理员或者某个用户来操作,可以通过列出流程定义中的所有任务节点,然后为每个任务节点添加操作者(角色或者用户甚至部门等信息),正在实现中
11 楼 zjlee 2007-07-23  
在那里操作自己定义的表呢?
10 楼 lyo 2007-07-23  
引用
也就是说这个#{processStarter}的值应该是系统中启动流程的当前用户。

把 processStarter设置成系统中启动流程的用户有什么意义吗?
9 楼 forhouor 2007-04-27  
在项目中大家好像都是这么做的吧
8 楼 SingleSea 2007-02-07  
十分期待
"JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(2)"
的推出,呵呵
7 楼 wolfwood 2007-01-29  
一直对这方面不了解
感谢楼主分享!
6 楼 shaucle 2007-01-29  
差沙 写道
你在哪工作亚,写文章是要冒生命危险的呀,,同情。。。


生命诚可贵
精华价更高
若为分享固
两者皆可抛
5 楼 差沙 2007-01-28  
你在哪工作亚,写文章是要冒生命危险的呀,,同情。。。
4 楼 geoboy 2007-01-25  
ServiceFactory serviceFactory = ServiceFactory.getInstance();
这个ServiceFactory是那个包里的啊?jbpm3.1.2没有这种用法啊
3 楼 tomkoo 2006-11-15  
2 楼 tomkoo 2006-11-15  
你的这个问题应该是数据库处理中文的问题,跟JBPM本身的关系不是很大,我用的是MSSQLServer没有问题,所以我暂时也不知道怎么弄。HOHO!
1 楼 jeffen2006 2006-11-14  
你写的文章对我帮助很大,同时请教一个问题,你用的数据库是mysql么,如何正确处理流程定义中的中文,如何配置?谢谢。
我也是深圳的。

相关推荐

    JBPM绑定自定义用户模型实现授权

    【JBPM绑定自定义用户模型实现授权】 JBPM(Java Business Process Management)是一个开源的工作流管理系统,用于构建和管理业务流程。在JBPM中,任务的授权和分配通常基于预定义的角色-用户模型,但这种模型可能...

    jbpm开发指南 jbpm 工作流 自定义

    jbpm开发指南 jbpm开发指南 jbpm 工作流 自定义

    jbpm流程自定义

    通过深入学习和实践jbpm流程自定义,开发者可以有效地构建和管理复杂的企业业务流程,实现业务流程的自动化和优化。同时,jbpm的灵活性和可扩展性使得它可以适应各种业务需求,成为企业级工作流解决方案的首选之一。

    jbpm的开发手册与用户指南

    jbpm的开发手册与用户指南是学习和使用jbpm进行业务流程管理的重要参考资料。 jbpm4.3中文开发手册: 这份手册详细介绍了jbpm 4.3版本的开发过程和技术细节。它涵盖了jbpm的核心概念,如流程定义、任务管理和事件...

    jbpm4表结构模型

    jbpm4表结构模型jbpm4表结构模型jbpm4表结构模型jbpm4表结构模型

    jbpm中文用户指南

    用户指南会涵盖如何使用jbpm的API创建自定义服务任务,以及使用Eclipse插件进行流程设计和调试。 10. **案例研究** 为了加深理解,用户指南通常会包含一些实际的业务场景,如人力资源管理、采购审批等,通过具体的...

    jbpm4.4开发用户指南

    5. **定制工作流界面**:讨论如何通过jBPM的Web服务接口集成自定义用户界面。 6. **安全性**:讲解如何配置用户权限,确保流程操作的安全性。 通过深入学习这两份指南,无论是开发者还是最终用户,都能获得全面的...

    jbpm jbpm3 jbpm4 用户和开发指南+教程+最佳实践全套

    通过这些文档,学习者可以全面了解jbpm的工作流程设计、实现和管理,同时掌握如何利用jbpm3和jbpm4来构建高效的企业级业务流程管理系统。无论是新手还是经验丰富的开发者,都能从中获取有价值的信息,提升自己在流程...

    JBPM4 PVM的流程定义模型与过程调度

    - **实现机制**: `EventImpl`通过`EventListenerReference`集合持有`EventListener`实例,从而方便地将事件与其监听器绑定在一起。 **CompositeElement** - **概念**: `CompositeElement`扩展了`ObservableElement...

    jBPM 4.4用户手册 中文PDF

    **jBPM 4.4 用户手册 中文PDF** **jBPM 4.4** 是一个开源的工作流程管理系统,由Red Hat公司开发并维护...通过深入研究并应用《jBPM 4.4 用户手册》,用户可以充分利用这些特性来优化和自动化业务流程,提高工作效率。

    jBPM 用户指南

    用户可以从 jBPM 的官方网站下载 jBPM 的源代码,并进行修改和自定义。但是,需要了解 jBPM 的许可证协议,避免侵犯 jBPM 的知识产权。 在使用 jBPM 时,需要了解 jBPM 的文档结构。jBPM 的文档结构包括用户指南、...

    用户自定义工作流后台java实现代码

    本资源提供的是一个用户自定义工作流后台的Java实现,它包括了JSP前端展示代码以及核心的工作流流转Java方法。下面将详细解释这些知识点。 首先,我们要理解什么是工作流。工作流(Workflow)是业务过程的部分或...

    jbpm关键点资料整理

    在jBPM 4.4版本中,涉及到的关键技术点主要包括任务分配、用户模型和自定义任务分配处理器。 任务分配是jBPM流程执行过程中的核心功能,它决定了任务如何被不同角色的用户或用户组接收并处理。任务分配主要有两种...

    jbpm+S2SH请假流程经典实现及源码

    同时,Spring的AOP(面向切面编程)可以用来实现细粒度的权限控制,确保只有授权的用户才能进行特定的审批操作。 在实际的源码中,"jbpm4.4_0400_completesample"可能是一个示例项目目录,其中包含了jbpm的工作流...

    JBPM4.4+SSH2 业务流 绑定表单Demo

    7. **实战应用**:这个Demo可以帮助开发者理解如何在实际项目中整合JBPM和SSH2,实现业务流程的自动化,并通过自定义表单提供用户交互界面。这对于构建企业级应用,提升业务效率具有重要的实践价值。 通过这个Demo...

    jbpm中文用户手册

    在"jBPM4.1中文用户手册"中,读者可以找到关于这些特性和功能的详细解释,包括如何创建和部署BPMN模型、配置工作流引擎、使用任务服务、集成规则引擎等操作步骤。此外,手册可能还会涵盖错误处理、性能调优、安全...

    jbpm教程+中文用户指南

    此外,用户指南通常还会介绍jbpm提供的监控工具,如流程实例的可视化跟踪,以及如何通过报表系统获取流程运行的统计信息。 总之,"jbpm教程+中文用户指南"是一套完整的学习资料,无论你是初学者还是有经验的开发者...

    jBPM_用户开发手册-中文版

    5. **监听器(Listeners)**:实现自定义行为,如在流程执行中的特定节点添加日志或执行额外逻辑。 ### 四、jBPM集成 jBPM可以轻松地与其他Java应用程序、Spring框架、REST服务以及各种企业级应用集成,如EJB、JMS...

    jbpm 4.4 用户指南与开发指南

    1. **流程建模**:jbpm 4.4支持使用Eclipse BPMN2模型进行流程设计,使得流程图直观易懂,同时也支持XML直接导入导出。 2. **工作流引擎**:jbpm内含高效的工作流引擎,能够执行复杂的业务流程,并处理各种流程分支...

Global site tag (gtag.js) - Google Analytics