`
chenjin
  • 浏览: 163107 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jbpm 使用日记5 一个简单会签示例

    博客分类:
  • java
阅读更多
   经过3周的努力,终于看到点收获的希望. 基本实现目前项目的工作流业务需求.

   以下例子中 采用了jbpm console 的几个示例用户

   项目提交人  : ernie .

   主管审批    : bert

   会签        : ernie , bert , grover

   老板审批    : grover



   正常流程: 项目金额  >= 500W RMB

  提交项目 --> 主管审批 --> 会签 --> 老板审批 --> 审批通过(结束)


   正常流程: 项目金额  < 500W RMB

  提交项目 --> 主管审批 --> 会签 --> 审批通过(结束)

  其中主管审批, 会签, 老板审批 , 不通过, 全部退回给项目提交人修改.

   会签中: 所有人全通过, 则通过.   任何一人不通过, 停止其他会签任务.退回给提交人.

  流程定义如下:

<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1"
	name="tc_prj_approval">

	<swimlane name="initiator" />

	<!-- 项目提交人 -->
	<swimlane name="requester">
		<assignment expression="user(ernie)" />
	</swimlane>

	<!-- 主管 -->
	<swimlane name="chief">
		<assignment expression="user(bert)" />
	</swimlane>

	<!-- 老板 -->
	<swimlane name="boss">
		<assignment expression="user(grover)" />
	</swimlane>

	<!-- 会签人 -->
	<swimlane name="cosinger">
		<assignment class="net.chenj.jbpm.sample.CosingerAssiHandler">
		</assignment>
	</swimlane>
	<start-state name="start">
		<task name="tc_prj_newprj" swimlane="initiator"></task>
		<transition name="to_submit" to="tc_prj_submit"></transition>
	</start-state>
	<task-node name="tc_prj_submit">
		<task name="tc_prj_submit"></task>
		<transition name="to_chiefapprove" to="tc_prj_chiefapprove"></transition>
	</task-node>
	<task-node name="tc_prj_chiefapprove">
		<task name="tc_prj_chiefapprove"></task>
		<transition name="approve" to="tc_prj_countersign"></transition>
		<transition name="disapprove" to="tc_prj_submit"></transition>
	</task-node>
	<task-node name="tc_prj_countersign" signal="last-wait"
		create-tasks="false">
		<task name="tc_prj_countersign">
			<event type="task-end">
				<action
					class="net.chenj.jbpm.sample.TaskEndCountersign">
				</action>
			</event>

		</task>

		<event type="node-enter">
			<action name="createInstance"
				class="net.chenj.jbpm.sample.CreateTaskInstanceCountersign">
			</action>
		</event>

		<transition name="approve" to="amount_decision"></transition>
		<transition name="disapprove" to="tc_prj_submit"></transition>
	</task-node>
	<decision name="amount_decision">
		<transition name="to_bossapprove" to="tc_prj_bossapprove"></transition>
		<transition name="to_end" to="end1"></transition>
	</decision>
	<task-node name="tc_prj_bossapprove">
		<task name="tc_prj_bossapprove"></task>
		<transition name="approve" to="end1"></transition>
		<transition name="disapprove" to="tc_prj_submit">
			<condition>#{amount >= 500}</condition>
		</transition>
	</task-node>
	<end-state name="end1"></end-state>
</process-definition>





会签swimlane class

package net.chenj.jbpm.sample;

import org.jbpm.graph.exe.*;
import org.jbpm.taskmgmt.def.*;
import org.jbpm.taskmgmt.exe.Assignable;

public class CosingerAssiHandler implements AssignmentHandler {

	private static final long serialVersionUID = 1L;

	public void assign(Assignable assignable, ExecutionContext executionContext) {
		// 从数据库或者ldap 读取会签人设置
		String[] a = { "ernie", "bert", "grover" };
		assignable.setPooledActors(a);
	}

}


创建会签任务实现类

package net.chenj.jbpm.sample;

import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.exe.Token;
import org.jbpm.graph.node.TaskNode;
import org.jbpm.taskmgmt.def.Task;
import org.jbpm.taskmgmt.exe.TaskMgmtInstance;

public class CreateTaskInstanceCountersign implements ActionHandler {

	private static final long serialVersionUID = 1L;

	public void execute(ExecutionContext executionContext) throws Exception {

		Token token = executionContext.getToken();
		TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
		TaskNode taskNode = (TaskNode) executionContext.getNode();
		Task task = taskNode.getTask("tc_prj_countersign");
		// 从数据库或者ldap 读取会签人设置创建任务实例
		tmi.createTaskInstance(task, token).setActorId("ernie");
		tmi.createTaskInstance(task, token).setActorId("bert");
		tmi.createTaskInstance(task, token).setActorId("grover");

	}

}


结束不通过时结束其他会签任务实现
package net.chenj.jbpm.sample;

import java.util.Collection;
import java.util.Iterator;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.jbpm.taskmgmt.exe.TaskMgmtInstance;

public class TaskEndCountersign implements ActionHandler {

	private static final long serialVersionUID = 1L;

	public void execute(ExecutionContext executionContext) throws Exception {

	
		boolean isDisapprove = Boolean.valueOf((String) executionContext
				.getVariable("isDisapprove"));
		// 如果有一个任务实例拒绝通过则结束除当前任务实例外其他任务实例
		if (isDisapprove) {
			TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
			TaskInstance ti = executionContext.getTaskInstance();
			final String actorId = ti.getActorId();
			Collection c = tmi.getSignallingTasks(executionContext);
			for (Iterator it = c.iterator(); it.hasNext();) {
				TaskInstance task = (TaskInstance) it.next();
				if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {
					task.end("disapprove");
				}
			}
		}

	}

}


感谢 tomkoo提供了会签的实现思路.



附件: 为流程定义IMG
  • 大小: 31.9 KB
分享到:
评论
5 楼 sifutian 2008-10-02  
spiritfrog 2008-05-23   回复
if (isDisapprove) {  
            TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();  
            TaskInstance ti = executionContext.getTaskInstance();  
            final String actorId = ti.getActorId();  
            Collection c = tmi.getSignallingTasks(executionContext);  
            for (Iterator it = c.iterator(); it.hasNext();) {  
                TaskInstance task = (TaskInstance) it.next();  
                if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {  
                    task.end("disapprove");  
                }  
            }  
        }  
难道不会发生token is locked 这样的错误?


这个问题怎么解决呢?我现在用这种方法解决会签,出现了这个问题,急切等待高手解说!
4 楼 spiritfrog 2008-05-23  
if (isDisapprove) {  
            TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();  
            TaskInstance ti = executionContext.getTaskInstance();  
            final String actorId = ti.getActorId();  
            Collection c = tmi.getSignallingTasks(executionContext);  
            for (Iterator it = c.iterator(); it.hasNext();) {  
                TaskInstance task = (TaskInstance) it.next();  
                if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {  
                    task.end("disapprove");  
                }  
            }  
        }  
难道不会发生token is locked 这样的错误?
3 楼 gabriel80 2008-04-24  
为什么会没人回答呢?
2 楼 gavin.guo 2007-03-14  
我用上面的swimlane 分配了下任务

总是有这样的结果:
New tasks have been assigned to: null, null, null.

我该怎么解决才好?
多谢呀!
1 楼 gavin.guo 2007-03-14  
兄弟,怎么下面的代码都没有用到呀?
<!-- 项目提交人 --> 
    <swimlane name="requester"> 
        <assignment expression="user(ernie)" /> 
    </swimlane> 
 
    <!-- 主管 --> 
    <swimlane name="chief"> 
        <assignment expression="user(bert)" /> 
    </swimlane> 
 
    <!-- 老板 --> 
    <swimlane name="boss"> 
        <assignment expression="user(grover)" /> 
    </swimlane> 
 
    <!-- 会签人 --> 
    <swimlane name="cosinger"> 
        <assignment class="net.chenj.jbpm.sample.CosingerAssiHandler"> 
        </assignment> 
    </swimlane> 

相关推荐

    jbpm使用简单示例

    **jbpm简介** jbpm(Java Business ...总之,"jbpm使用简单示例"是一个很好的学习资源,通过它,开发者不仅可以了解jbpm的基本操作,还能掌握如何在实际项目中运用流程管理技术,提升业务系统的灵活性和可维护性。

    jbpm4.3 会签的实现

    下面是一个简单的会签任务创建示例: ```java TaskService taskService = ... // 获取TaskService实例 Task task = taskService.createTask(); taskService.addCandidateUser(task.getId(), "user1"); taskService....

    JBPM4.4会签实例

    JBPM(Java Business Process Management)是一个开源的工作流管理系统,用于管理和执行业务流程。在JBPM4.4版本中,它提供了一个强大的平台来设计、部署和执行复杂的业务流程,其中包括了会签功能。会签,也称为...

    JBPM4.3 Spring会签 实例

    在这个流程中,可以设置多个并行的任务节点,每个节点代表一个会签的角色。通过使用边界事件和多实例任务,我们可以实现会签的逻辑。多实例任务允许我们指定一个条件,例如所有参与者的签名都收集完毕,以便结束当前...

    jBPM4工作流示例jbpmDemo

    总的来说,jbpmDemo通过一个生动的示例,展示了jBPM4如何有效地管理和执行工作流,同时利用Canvas动画增强了用户体验。学习和研究这个示例,不仅可以提升对jBPM4的理解,还能增强在实际项目中应用工作流管理系统的...

    JPBM 会签 示例

    JBPM 是一个开源的工作流管理系统,它允许开发者和业务分析师设计、部署和执行业务流程。会签,即多人参与并同意后才能继续流程的步骤,是流程管理中的重要环节,尤其在企业协作和审批流程中常见。 【描述】"简单的...

    jbpm 请假示例 简易 修改版

    【jbpm 请假示例 简易 修改版】是一个基于jbpm工作流引擎的简单应用实例,旨在演示如何在企业级环境中实现一个请假流程。jbpm是一个开源的工作流管理系统,它提供了完整的业务流程自动化解决方案,包括流程设计、...

    jbpm4jbpm5

    jbpm是一个开源的工作流管理系统,用于帮助开发者实现业务流程自动化。以下是基于给定文件的信息,深入解析jbpm4和jbpm5的知识点: 1. **jbpm4表结构和表字段说明**: jbpm4.3表结构和表字段说明文档通常会详细...

    jbpm4.4 会签 测试( fork & join)

    文件名"countersign2"可能表示这是一个关于二次会签或者多阶段会签的示例。在实际应用中,可能包含了一个或多个fork节点来创建并行审批流,以及join节点来等待所有审批结果,确保所有必要的决策都被考虑在内。 在...

    jbpm5安装、配置、示例入门

    JBPM5是JBPM的一个重要版本,提供了更为强大的工作流管理功能,并且支持多种部署方式。 #### 二、下载与安装 ##### 下载JBPM5 - 访问JBPM官方网站(http://www.jboss.org/jbpm5.0final),下载完整的JBPM5安装包。...

    JBPM4.3完整示例

    示例中包含的TestWorkFolwJBPM可能是一个简单的流程演示,展示了如何使用引擎启动和控制流程。 7. **集成能力(Integration Capabilities)**:JBPM4.3可以与其他Java应用无缝集成,例如Spring框架。此外,还支持...

    jbpm工作流(会签,串签)

    在jbpm中,流程部署是将一个流程定义文件(通常是.bpmn或.jpdl格式)上传到jbpm服务器的过程。这个文件包含了流程的所有细节,如活动、任务、网关等。部署后,这些流程就可以被实例化并执行。你可以通过jbpm提供的...

    jBPM 4使用手记

    jBPM 4提供了一个图形化的流程建模工具——jBPM Designer,通过它可以使用BPMN 2.0语言创建流程模型。设计师允许用户拖放活动、事件、网关等元素,实现流程的可视化设计,同时支持导出为XML格式的流程定义文件(....

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

    在实现会签时,我们可以创建一个custom节点,然后在其中编写Java代码或者使用脚本来处理会签逻辑,包括分配任务给审批人、处理审批结果以及根据需要进行加签或减签操作。 加签功能是在流程运行过程中,根据业务需求...

    jbpm 的一个相关示例

    这个示例项目提供了一个全面展示JBPM功能的平台,它可以在多种数据库环境和Web服务器上运行,展现了其强大的兼容性和灵活性。 JBPM的核心功能包括工作流定义、流程实例管理、任务分配、事件处理以及报表生成等。它...

    jbpm会签.zip

    jbpm(Java Business Process Management)是一个开源的工作流和业务流程管理框架,主要用于设计、执行和管理复杂的业务流程。会签,又称多人签名或并行审批,是jbpm中的一种常见功能,它允许流程中的多个参与者同时...

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

    - 设计流程图:首先,你需要使用Drools工作流编辑器创建一个包含会签节点的流程图。 - 配置任务节点:在会签节点上设置多个人员或组作为参与者,定义审批顺序(串行或并行)。 - 实现加签和减签逻辑:编写Java...

    jbpm5环境配置、中文文档

    7. **创建第一个jbpm流程**:在Eclipse中,使用jbpm插件创建一个新的工作流项目,设计并编写流程定义文件(.bpmn或.bpmn2),并编译生成流程定义的XML文件。 8. **部署和测试流程**:将流程部署到Guvnor,然后在...

    jbpm5安装DEMO

    使用Ant执行`install.demo`脚本,这将根据`build.xml`文件自动下载并安装jBPM5所需的一系列依赖组件,包括但不限于: - BIRT运行时环境 - jBPM设计师插件 - Drools规则引擎及其Eclipse插件 - Eclipse IDE - GEF SDK...

Global site tag (gtag.js) - Google Analytics