`

JBPM4中的任务回退、补签、自由流程实现

阅读更多

最近在实施政府办公项目的时候,经常有客户在问,公文的流程能否自由流转,如我在拟稿完成后,直接归档,不需要再经过核稿与审批流程。同样,我可以在任何一个任务上,直接把任务回退到以上任何一个环节,如,在审批的过程中,若不合适,可以直接回退至拟稿任务。如下图所示:

 



    非常幸运,JBPM4也提供了给我们动态创建Transition的接口。即在当前的节点中,动态创建出当前节点所有的跳转的Transition,问题是如果你给你的活动节点创建了连接后,下一次进入该任务时,不能显示这些动态创建的连接。否则当前任务的跳转连接会越来越多。

      所以对于那些在两个节点间不存在的连接,而又想实现这两个节点的跳转的话,就需要动态创建连接,然后再实现任务跳转,跳转后再进行删除连接。相当于现实中我们所说的过河拆桥模式。

 

     有了这种思想,Jbpm实现任务回退、补签等操作都是相当容易。

 

 

动态创建:

 

Java代码
  1. /**  
  2.  * 动态创建连接当前任务节点至名称为destName的节点的Transition  
  3.  * @param taskId 任务节点ID  
  4.  * @param sourceName 源节点名称  
  5.  * @param destName  目标节点名称  
  6.  */  
  7. public void addOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){   
  8.   
  9.  EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine;   
  10.  Environment env=null;   
  11.  try {   
  12.      env = environmentFactory.openEnvironment();   
  13.      //取得当前流程的活动定义   
  14.      ActivityImpl sourceActivity = pd.findActivity(sourceName);   
  15.      //取得目标的活动定义   
  16.      ActivityImpl destActivity=pd.findActivity(destName);   
  17.   
  18.      //为两个节点创建连接   
  19.   
  20.      TransitionImpl transition = sourceActivity.createOutgoingTransition();   
  21.   
  22.      transition.setName("to" + destName);   
  23.   
  24.      transition.setDestination(destActivity);   
  25.   
  26.      sourceActivity.addOutgoingTransition(transition);   
  27.   
  28.  }catch(Exception ex){   
  29.      logger.error(ex.getMessage());   
  30.   
  31.  }finally{   
  32.      if(env!=null)env.close();   
  33.   
  34.  }   
  35. }  
/**
	  * 动态创建连接当前任务节点至名称为destName的节点的Transition
	  * @param taskId 任务节点ID
	  * @param sourceName 源节点名称
	  * @param destName  目标节点名称
	  */
	 public void addOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){

		 EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine;
		 Environment env=null;
		 try {
			 env = environmentFactory.openEnvironment();
			 //取得当前流程的活动定义
			 ActivityImpl sourceActivity = pd.findActivity(sourceName);
			 //取得目标的活动定义
			 ActivityImpl destActivity=pd.findActivity(destName);

			 //为两个节点创建连接

			 TransitionImpl transition = sourceActivity.createOutgoingTransition();

			 transition.setName("to" + destName);

			 transition.setDestination(destActivity);

			 sourceActivity.addOutgoingTransition(transition);

		 }catch(Exception ex){
			 logger.error(ex.getMessage());

		 }finally{
			 if(env!=null)env.close();

		 }
	 }

  动态删除:

 

 

Java代码
  1. /**  
  2.  * 动态删除连接sourceName与destName的Transition  
  3.  * @param taskId  
  4.  * @param sourceName  
  5.  * @param destName  
  6.  */  
  7. public void removeOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){   
  8.  EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine;   
  9.  Environment env=null;   
  10.  try {   
  11.      env = environmentFactory.openEnvironment();   
  12.      //取得当前流程的活动定义   
  13.      ActivityImpl sourceActivity = pd.findActivity(sourceName);   
  14.         
  15.      //若存在这个连接,则需要把该连接删除   
  16.      List<Transition> trans=sourceActivity.getOutgoingTransitions();   
  17.      for(Transition tran:trans){   
  18.         if(destName.equals(tran.getDestination().getName())){//删除该连接   
  19.             trans.remove(tran);   
  20.             break;   
  21.         }   
  22.      }   
  23.  }catch(Exception ex){   
  24.      logger.error(ex.getMessage());   
  25.  }finally{   
  26.      if(env!=null)env.close();   
  27.  }   
  28. }  
/**
	  * 动态删除连接sourceName与destName的Transition
	  * @param taskId
	  * @param sourceName
	  * @param destName
	  */
	 public void removeOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){
		 EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine;
		 Environment env=null;
		 try {
			 env = environmentFactory.openEnvironment();
			 //取得当前流程的活动定义
			 ActivityImpl sourceActivity = pd.findActivity(sourceName);
			 
			 //若存在这个连接,则需要把该连接删除
			 List<Transition> trans=sourceActivity.getOutgoingTransitions();
			 for(Transition tran:trans){
				if(destName.equals(tran.getDestination().getName())){//删除该连接
					trans.remove(tran);
					break;
				}
			 }
		 }catch(Exception ex){
			 logger.error(ex.getMessage());
		 }finally{
			 if(env!=null)env.close();
		 }
	 }

 

其实现效果如下所示,可以跳至任何节点,并且可以指派给任何人。

 

指定至相关人员:

 

 

 

分享到:
评论

相关推荐

    JOffice2中的JBPM4的任务回退实现

    总的来说,JOffice2中的JBPM4任务回退功能提供了灵活的方式来处理流程中的错误或异常情况,而无需完全重新启动流程。通过这两种实现方式,开发人员可以根据具体需求选择最适合的策略,以确保流程管理的有效性和效率...

    jbpm4.4 请假的例子,包含Jar包,实现回退功能可以运行

    在JBPM4.4版本中,我们可以看到一个具体的请假流程示例,该示例包含了实现回退功能的完整代码和Jar包,便于开发者理解和学习。 1. **流程设计** JBPM使用BPMN2.0(Business Process Model and Notation)标准进行...

    jbpm4流程提交及执行完整代码

    在jbpm4中,我们可以通过服务接口来启动流程实例、完成任务、查询流程状态等。这个文件可能包含诸如`startProcessInstanceByKey`(根据流程定义的关键字启动流程)和`completeTask`(完成当前任务节点)等方法。理解...

    JBPM4.4实现一种无需指定上一节点(previous activity)的流程驳回(回退)

    标题中的“JBPM4.4实现一种无需指定上一节点(previous activity)的流程驳回(回退)”是指在使用JBPM(Java Business Process Management)4.4版本时,设计了一个特殊的流程控制机制,允许用户在执行流程过程中进行回...

    jbpm4 完整的请假流程

    jbpm4是一个基于Java的...通过深入研究这个“jbpm4 完整的请假流程”,不仅可以掌握jbpm4的基本用法,还能理解业务流程管理系统的运作机制,这对于在实际工作中设计和实现复杂的企业级流程管理解决方案具有重要意义。

    JBPM4 开发文档 实例 流程

    - **部署流程**:通过deploy操作,会在相应的表中创建记录,如jbpm4_deployment、jbpm4_deployprop和jbpm4_lob。 - **启动流程实例**:调用startProcessInstanceByKey方法,会在执行表jbpm4_execution、历史记录表...

    jbpm4jbpm5

    jbpm4.3表结构和表字段说明文档通常会详细介绍jbpm4中涉及的数据库表,包括实体如任务实例(TaskInstance)、流程实例(ProcessInstance)、工作项(WorkItem)等的表结构和字段。这些信息对于开发者来说至关重要,...

    jbpm4源代码 简单实现公文流转

    3. **持久化**:jbpm4利用JPA(Java Persistence API)进行持久化管理,可以将流程实例、任务信息等数据存储在数据库中,确保数据的安全性和可靠性。 4. **规则集成**:jbpm4集成了Drools规则引擎,可以在流程执行...

    JBPM4.4完整可用审批流程

    在实际应用中,开发者需要了解JBPM4的工作原理,包括流程实例、任务实例、信号和事件的概念,以及如何通过API或服务任务与外部系统交互。熟悉Maven的使用也是至关重要的,包括理解POM文件的结构、如何添加和排除依赖...

    JBoss JBPM4请假流程示例

    在JBoss JBPM4中,一个流程通常由一系列任务组成,这些任务可以由系统自动执行,也可以由人参与完成。请假流程就是一个典型的人工参与的任务流程,包括请假申请、审批等步骤。在这个示例中,我们将探讨以下几个关键...

    JBPM7基础开发

    在开发中,主要使用 API 来实现流程的管理和执行。KieService 是 JBPM6 中的一个重要的 API,用于获取流程管理策略和资源加载源选取。KieContainer 是一个资源库和会话接口封装,提供了 KieBase、KieSession 和 ...

    JBPM 流程 监控 的实现

    6. **使用流程审计表**:JBPM的持久化机制会将流程实例和任务的状态记录在数据库的审计表中,可以通过查询这些审计表来获取流程的运行状态,从而实现监控。 7. **设计和实现监控服务**:创建一个独立的服务,该服务...

    jbpm4案例源码

    开发者可以通过查看和运行这些源代码,学习如何创建用户交互界面、与jbpm4服务交互以及如何实现流程的生命周期管理。 jbpm4还支持扩展和定制,例如,你可以通过编写自定义的工作流监听器、任务监听器和事件处理器来...

    extjs jbpm4流程设计器

    ExtJS和jBPM4是两个在IT领域中用于构建企业级应用的重要工具。ExtJS是一个JavaScript库,专用于创建富客户端用户界面,而jBPM4则是一个工作流管理系统,用于管理和执行业务流程。本篇文章将深入探讨这两个技术如何...

    jbpm4 s2sh 请假流程

    【jbpm4 s2sh 请假流程】是一个基于jbpm工作流引擎和SSH(Struts2、Spring、Hibernate)框架的简单示例应用,用于演示如何在Java Web环境中实现一个请假流程。在这个教程中,我们将深入理解jbpm4的工作原理以及如何...

    JBPM视屏教程共9节 jBPM 4视频教程04设计请假流程

    学习者将学习到如何使用jBPM的建模工具创建流程图,配置任务节点、事件和决策,以及如何通过代码实现流程的启动和控制。同时,这个系列教程可能还涵盖了流程实例的监控、跟踪和优化等高级主题,帮助开发者或业务分析...

    JBPM流程监控的实现过程

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

    jBPM4工作流应用开发指南.pdf

    - **基础概念:** 介绍工作流、BPMN(业务流程建模符号)、jBPM4中的关键术语和概念,帮助开发者建立基础知识体系。 - **流程定义:** 深入讲解jPDL、流程图的创建和编辑,让开发者学会如何定义业务流程。 - **...

Global site tag (gtag.js) - Google Analytics