`
man1900
  • 浏览: 429158 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • JBPM
阅读更多

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

 



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

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

 

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

 

 

动态创建:

 

	 /**
	  * 动态创建连接当前任务节点至名称为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();

		 }
	 }

  动态删除:

 

 

	 /**
	  * 动态删除连接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();
		 }
	 }

 

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

 

指定至相关人员:

 

 

 

  • 大小: 32.1 KB
  • 大小: 94.9 KB
  • 大小: 51.8 KB
  • 大小: 87.9 KB
9
2
分享到:
评论
11 楼 fatter 2012-07-11  
是啊,lz,贴点代码出来呀
10 楼 wangsang111 2012-03-28  
您好,怎么调用自动创建的transcation呢,谢谢
9 楼 man1900 2011-08-20  
是的,没有用到
8 楼 tearaskflower 2011-08-20  
你好,楼主,回退,你没用监听器吗?
7 楼 peter2009 2011-03-11  
能否提供一下源码看看

为什么我取回了原来的任务后重新提交后
总是提交不了呢

还需要提供删除创建的自由流程吗
6 楼 ixujieyun 2010-12-23  
你好。我跟具您的代码做了测试,成功创建了自有流但是发现有个问题就是,创建数据成功之后无法将数据真正的保存到数据库中,没有真正提交数据,在AS运行状态下执行了但是数据库里的任务还是在原来的节点,请问这是为什么
5 楼 280946352 2010-12-17  
你好,楼主:能共享一下你的完整的源码吗?正在用JBPM4.4研究自由流程,想参考一下你的源码
4 楼 man1900 2010-07-29  
最近开发任务比较多,没有时间整理,等忙完这段时间,把代码给大家共享一下
3 楼 zhutuncun0 2010-07-29  
还有我也像你这的添加Transition,但是CompleteTask的时候老是报 找不到该Transition 名字错误,是什么导致的,是事务吗?我没有集成到spring中
2 楼 zhutuncun0 2010-07-29  
我也是刚要入门的,看论坛有人使用的ExecutionImpl.moveTo()方法,但是我没有成功实现回退,能否给解释下,同时也请求共享一下:zhutuncun0@sina.com
1 楼 fucktianya 2010-06-10  
兄弟,可不可以把详细点的代码发给我看看啊,

我正在使用JBPM4,也想实现你说的这个任务回退和自由流程的问题

可因为是刚学,所以不是很明白,所以想请你把可以共享的代码发我一份好不?

我的邮箱caoshuo@sohu.com

相关推荐

Global site tag (gtag.js) - Google Analytics