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

JBPM流程通过Aciton动态创建TaskInstance来实现“会签”(续)

    博客分类:
  • JBPM
阅读更多
前面写过一篇文章《JBPM流程通过Aciton动态创建TaskInstance来实现“会签”》,不过那篇文章可以说是一个大体思路的简单实现,并不完整,也有不少朋友提出了不少的问题。因为做事要善始善终,所以再次贴出这一主题,把会签进行到底。

参考文章:
JBPM流程通过Aciton动态创建TaskInstance来实现“会签”
JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(1)

第一步还是给出一个新的ProcessDefinition.xml流程定义文件:

<?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="审批" signal="last-wait" create-tasks="false" end-tasks="true">
		<task name="审批">

		</task>
		<event type="node-enter">
			<action name="createInstance"
				class="com.sky.plugin.jbpm.def.DynamicCreateTaskInstance">
			</action>
		</event>

		<event type="task-end">
			<action name="createInstance"
				class="com.sky.plugin.jbpm.def.ConuntersignActionHandler">
			</action>
		</event>

		<transition name="同意" to="结束">
			<action name="createInstance"
				class="com.sky.plugin.jbpm.def.TestActionHandel">
			</action>
		</transition>
		<transition name="拒绝到复核人" to="复核"></transition>
	</task-node>

	<end-state name="结束"></end-state>


</process-definition>


这里除了“文章1”说到要注意的地方外,还要注意的两个地方是:


    1. <event type="node-enter">
       进入流程节点的时候,执行ActionHandler类com.sky.plugin.jbpm.def.DynamicCreateTaskInstance,用来动态生成TaskInstance。
    2. <event type="task-end">
    Task结束的时候调用com.sky.plugin.jbpm.def.ConuntersignActionHandler进行会签处理。判断会签路径来决定会签的执行和走向。


com.sky.plugin.jbpm.def.DynamicCreateTaskInstance
public class DynamicCreateTaskInstance implements ActionHandler {
	
	private static final long serialVersionUID = 1L;

	public void execute(ExecutionContext context) throws Exception {
		
		ProcessDefinition processDefinition = context.getProcessDefinition();

		TaskNode taskNode = (TaskNode) context.getNode();
		Task task = (Task)taskNode.getTasks().iterator().next();

		Long processDefinitionId = processDefinition.getId();
		Long taskId = task.getId();
		
		Token token = context.getToken();
		TaskMgmtInstance tmi = context.getTaskMgmtInstance();
		
		//获取自定义的进行会签的人员
		ServiceFactory serviceFactory = ServiceFactory.getInstance();
		ProcessService ps = serviceFactory.getProcessService();
		String[] actors = ps.loadTaskActors(processDefinitionId, taskId);
		
		//根据会签人员,每人创建一个TaskInstance
		for(String actor : actors){
			tmi.createTaskInstance(task, token).setActorId(actor);
		}
	}
}


com.sky.plugin.jbpm.def.ConuntersignActionHandler
public class ConuntersignActionHandler implements ActionHandler {

	private static final long serialVersionUID = 1L;

	@SuppressWarnings("unchecked")
	public void execute(ExecutionContext context) throws Exception {

		Token token = context.getToken();

		TaskMgmtInstance tmi = context.getTaskMgmtInstance();

		Collection<TaskInstance> unfinishedTasks = tmi
				.getUnfinishedTasks(token);

		Object variable = context.getVariable("selectedTransition");
		String selectedTransition;
		if (variable == null) {
			throw new RuntimeException(
					"Jbpm transition error: user selected transition is null!");
		} else {
			// 获取当前TaskInstance选择的路径
			selectedTransition = variable.toString();
		}

		// 如果用户选择的路径是流程定义中制定的不通过的路径,则自动完成余下所有的会签Task并转到相应路径
		if (selectedTransition.equals("拒绝到复核人")) {
			for (TaskInstance unfinishedTaskInstance : unfinishedTasks) {
				// 把被结束的没有完成的TaskInstance的ActorId改为automatic complete
				if (!unfinishedTaskInstance.hasEnded()) {
					unfinishedTaskInstance.setActorId("automatic complete");
					unfinishedTaskInstance.end("拒绝到复核人");
				}
			}
		}
	}

}


这个类对于会签是至关重要的,要通过这个Action来判断会签的情况。在这个Action中有这样几句代码:
Object variable = context.getVariable("selectedTransition");
		String selectedTransition;
		if (variable == null) {
			throw new RuntimeException(
					"Jbpm transition error: user selected transition is null!");
		} else {
			// 获取当前TaskInstance选择的路径
			selectedTransition = variable.toString();
		}

其中的selectedTransition是用户选择的路径,也就是通过这个来判断会签的用户选择了“同意”或者“拒绝到复核人”,你可以通过流程变量的形式来保存。

如果“同意”,则继续下去,直到该TaskNode中所有的TaskInstance完成以后,通过会签,继续下去,如果选择“拒绝到复核人”,则会自动完成余下的所有TaskInstance,然后转到Transition“拒绝到复核人”,会签不通过。
其中有一句,设置所有自动完成的TaskInstance的Actor为“automatic complete”,这个可以解决在“以办事务”中出现自动完成的任务(TaskInstance)
unfinishedTaskInstance.setActorId("automatic complete");


到这里整个会签的实现都在这里了,行文有点乱。哈哈!
分享到:
评论
9 楼 taowanli 2012-10-23  
把源码放出来噻。
8 楼 dyw8021 2007-08-30  
请教一个问题。就是说我有一个审批流程,在每个task-node接点呢,我有三个transition,分别是指向通过、不通过、返回修改task-node。我看过很多例子,大部分的作法是要调用TaskInstance.end()方法人为去指向某个接点。我感觉这样子工作流没有充分发挥作用,有没有办法就是说我在task-node配置一个expression或是别的,通过我传的参数值让jbpm自动帮我判断走向呢。我知道变通的作法就是再加一个decision,但是每个审批步骤再加一个decision或是共用一个decision会弄得流程图非常难看、复杂。有没有更好的办法呢,请赐教?
7 楼 kjj 2007-06-29  
楼上的问题好像是要用到superstate吧
6 楼 wuxufeng8080 2007-06-13  
一个问题,我们有这么一个需求。
我们希望所有的任务结束了之后,再判断这个流程往哪个transition走。但是不同了任务end的transition不同。到时候流程怎么判断要往哪个方向?或者能不能再最后一个任务完成的时候重新修改其他的任务都往同一个transition走?

请问楼主怎么处理这种问题?
5 楼 whzresponse 2007-03-14  
楼主能否给我一份完整的代码?谢谢了我的email和MSN:whz-accp@163.com
4 楼 tomkoo 2007-03-13  
你可以看看JDK5的文档。这种循环方式是JDK5.0新加的。
3 楼 jamjar 2007-03-10  
for (TaskInstance unfinishedTaskInstance : unfinishedTasks)
这种语法没见过啊,楼主能不能稍微解释下
2 楼 jamjar 2007-03-09  
这个ServiceFactory要自己写的,不是jbpm里的
1 楼 geoboy 2007-01-25  
ServiceFactory serviceFactory = ServiceFactory.getInstance();
这个ServiceFactory是那个包里的啊?jbpm3.1.2没有这种用法啊

相关推荐

    JBPM流程监控的实现过程

    本文将深入探讨如何通过手工编码方式在JBPM中实现流程监控,包括如何监控已发布流程的状态、流程实例的动态以及任务实例的执行情况。 #### 一、理解流程监控的核心需求 流程监控的核心目标在于实时掌握系统内流程...

    jbpm4.3 会签的实现

    jbpm是一个开源的工作流管理框架,版本4.3提供了丰富的功能来支持复杂的企业流程,其中包括会签的实现。本文将深入探讨jbpm4.3如何实现会签功能,并分享相关的源码和工具使用。 1. jbpm4.3概述: jbpm4.3是jbpm的一...

    JBPM采购申请系统——08_JBPM流程节点.7z

    JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM...

    JBPM 流程 监控 的实现

    4. **集成第三方监控工具**:可以将JBPM与像Prometheus、ELK Stack(Elasticsearch、Logstash、Kibana)等监控工具集成,通过这些工具的强大分析能力来实现对JBPM流程的性能监控和故障排查。 5. **扩展jbpm-console...

    JBPM流程引擎资料

    这些节点的处理方式,例如如何通过decision条件或表达式进行决策,如何实现并行分支,如何结束流程实例等,都是jBPM流程设计的关键知识点。 自动活动(Automatic Activities)是流程中无需人工干预的部分,文档对于...

    揭秘jbpm流程引擎内核设计思想及构架.doc

    jbpm流程引擎内核的设计思想和结构是jbpm流程引擎的核心部分,掌握了jbpm流程引擎内核的设计思想和结构,才能真正理解jbpm流程引擎的工作原理,并且能够更好地应用jbpm流程引擎来解决实际问题。 流程引擎内核的设计...

    JBPM流程引擎设计 工作流资料

    JBPM流程引擎设计是IT领域中的一个重要知识点,尤其对于那些希望理解和实施企业级工作流管理系统的人员来说,它是不可或缺的。 1. **流程建模**:JBPM支持BPMN 2.0(Business Process Model and Notation)标准,这...

    jbpm流程设计器

    jbpm(Java Business Process Management)是一个开源的企业级工作流管理系统,它允许开发者通过定义业务流程来自动化企业的业务操作。jbpm流程设计器作为jbpm框架的重要组成部分,提供了一个直观的图形化界面,使得...

    jBPM4.4 会签,用custom实现(带加签、减签功能)

    在jBPM中,我们可以通过动态修改流程实例的结构来实现加签。例如,当一个特定条件满足时,我们的custom节点可以增加一个新的多实例任务,并将其分配给新添加的审批人。 减签则是在流程进行中,因为某些原因不再需要...

    JBPM4.4会签实例

    通过学习"CountersignDemo"这个实例,你可以深入了解JBPM4.4的会签实现,包括如何设计流程、创建自定义活动、编写工具类以及如何在实际应用中部署和使用。这将有助于提升你对业务流程管理的理解,使你能更好地为企业...

    JBPM流程代码演示

    在JBPM中,通常会创建一个应用实例来启动和管理流程实例。它可能包含了启动流程、处理任务、完成任务等操作的逻辑。 2. **WorkFlowApplication.java**:这个文件可能是工作流应用的接口或抽象类,定义了与流程管理...

    揭秘jbpm流程引擎内核.pdf

    通过深入理解jbpm流程引擎的内核,开发者可以更好地利用其特性来构建高效、可维护的业务流程系统。这个教程“揭秘jbpm流程引擎内核.pdf”很可能是对jbpm核心机制的详细解析,包括引擎的内部结构、执行流程、任务调度...

    jBPM4.4 会签(带加签、减签功能)

    在jbPM中实现加签,可以通过动态修改任务参与者的方式来达成。这通常需要编写自定义服务任务或者监听器,当满足特定条件时,动态插入新的参与者到任务实例中。 4. **减签功能** 减签则是在流程进行中,某些审批者...

    jbpm流程监控的实现

    这可以通过jbpm提供的Rest API或者JMX接口来获取实时和历史的流程数据。数据可以包括:流程实例的数量、状态分布、平均执行时间、活动等待情况等。 5. **分析与优化**:监控数据可用于业务流程的分析。例如,如果...

    MyEclipse6.0下Jbpm流程设计器

    通过Jbpm设计器,开发者可以创建流程模型,包括开始节点、结束节点、用户任务、服务任务、 Exclusive Gateway(排他网关)、Inclusive Gateway(并行网关)以及Intermediate Catch Event(中间捕获事件)等。...

    揭秘jbpm流程引擎内核设计思想及构架.docx

    jbpm流程引擎内核的设计思想和构架对于理解jbpm流程引擎的工作原理和实现机制非常重要,同时对于开发和应用jbpm流程引擎也具有重要的参考价值。 在jbpm流程引擎内核中,还有一些其他重要的技术和概念,例如: 1. ...

    jbpm工作流(会签,串签)

    这通常通过序列流(Sequence Flow)来实现,每个任务完成后,流程才会流转到下一个任务。 查询已办和待办任务是流程参与者日常操作的重要部分。jbpm提供了任务查询服务,可以基于各种条件(如任务状态、任务负责人...

    jbpm流程设计器 + 生成对应xml文档 完美实现

    jbpm流程设计器 + 生成对应xml文档: 内部含有: jbpm控件 1: myflow2:插件原本内容 访问地址:http://localhost:8080/jbpmFlow1/myflow2/demo4.jsp 实现生成对应xml文档 并写有对xml文档读取存储到对象中,...

    JBPM4.3 Spring会签 实例

    其次,创建流程定义(.bpmn文件)来描述会签流程。在这个流程中,可以设置多个并行的任务节点,每个节点代表一个会签的角色。通过使用边界事件和多实例任务,我们可以实现会签的逻辑。多实例任务允许我们指定一个...

Global site tag (gtag.js) - Google Analytics