详解Java EE工作流管理系统jBPM的FORK中节点同步功能
创始人
2024-07-18 15:21:28
0

51CTO一直都关注Java EE工作流管理系统jBPM,在Java EE工作流管理系统jBPM中除功能节点(指START-STATE,END-State,Fork,Join,Decision)外,业务逻辑全放在NODE节点的ACTION中来实现。本文将详解Java EE工作流管理系统jBPM的FORK中节点同步功能。

  1. public class DemoActionHandler implements ActionHandler {   
  2.  
  3. Java代码   
  4. /**   
  5.      * 简单的ACTIONHANDLER DEMO   
  6.      */    
  7.     private static final long serialVersionUID = 1L;    
  8.     
  9.     @SuppressWarnings("unchecked")    
  10.     @Override    
  11.     public void execute(ExecutionContext executionContext) throws Exception {    
  12.         Node node = executionContext.getNode();    
  13.     
  14.         System.out.print(executionContext.getProcessInstance().getId());    
  15.         System.out.println("--[" + node.getName() + "] ["    
  16.                 + new java.util.Date()+"]");    
  17.         ContextInstance cxtInstance = executionContext.getProcessInstance()    
  18.                 .getContextInstance();    
  19.         try {    
  20.              Date date = new Date();    
  21.              Date startDate = (Date) cxtInstance.getVariable("STARTDATE");    
  22.              System.out.println("执行到此节点共用时:" + ""    
  23.              + (date.getTime() - startDate.getTime()));    
  24.                              
  25.         } catch (Exception e) {    
  26.                         e.printStackTrace();    
  27.                     }    
  28.         Thread.sleep(6000);    
  29.         node.leave(executionContext);    
  30.     }    
  31. }    
  32.  

我写了一个简单的流程,串行的,不包含分支,只包含开始,结束,NODE三种类型的节点。将流程发布,创建实例 ,在实例启动后用轮询的方式查询跟踪token所在的位置(如果有分支的情况下可能需要考虑子token的情况),发现个流程的监控结果只有两个结点:START和END,这是为什么呢,首先想到的是流程实例的状态并没有实时的保存或是说持久化到数据库中去。

再结合自己的程序想了一下,程序中的节点全部是NODE类型的自动节点,流程在执行的时候,会直到一个等待节点才将流程实例持久化到数据库中。但如果将NODE节点的async(异步执行)属性设置的true,流程会在执行到该节点时,会启动一个线程来执行NODE的ACTIONHANDLER,而TOKEN本身会挂起,等待执行完毕的消息,事务因此也将由一个被分裂为两个独立的事务.也就是说,原来从开始执行到等待状态为止的一个事务被异步节点分了成多个事务,流程会在执行异步节点的ACTIONHANDLER时将事务提交,流程实例的状态也就会持久化到数据库中去。
于是加上

  1. Java代码   
  2. node.setAsync(true);    
  3.  

接着测试有分支的情况,又发现fork下的节点是依次执行的,查了资料,有如下的说法

引用

fork的底层其实是依次调用各个transition,而不是真正意义的同步,如果需要同步,请参考JBPM异步设置

于是把FORK节点的async属性也设置成了true,测试后发现还是不行。按照上面的说法,fork在执行各个分支的时候,采用了类似遍历的方式调用各个分支,但不至于非得执行完成一个分支后再执行另一个分支。无奈放下了,开始查找资料,这部分工作也是因此搁浅了将近一天的时间。晚上在家查阅资料的时候,发现有人提起了JobExecutor的线程个数,我觉得有可能这个的原因。翻下源码,找了个API试验一下

  1. Java代码   
  2. jobExecutor = jbpmConfiguration.getJobExecutor();    
  3.     jobExecutor.setNbrOfThreads(5);    
  4.     jobExecutor.start();    
  5.  

结果喜剧了,我惊喜的发现,fork下的节点竟然同步执行了(当然同步的执行也会有先后)。

虽然这本来就是fork节点的基本作用,但实际用起来的时候还是会遇到各种战利品样的问题。原因就在这里,如果不设置其线程数,JobExecutor默认启动一个线程为工作,这样就导致fork下的节点进入了队列,结果就是串行执行了。

【编辑推荐】

  1. Java EE工作流管理系统jBPM
  2. jBPM数据库表说明:流程节点表
  3. jBPM 4.4正式发布 Java工作流管理系统
  4. jBPM实现高级交互模式详解

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...