`

关于jbpm4流程并发的一点疑惑

    博客分类:
  • JBPM
阅读更多

最近由于工作上的需要,想用jbpm4实现自动节点的并发运行,首先考虑的就是forkjoin节点,但是并没有达到我想看到的线程级别的并发。

先说一下的我运行的例子吧!

实验思路:设置fork的属性为 <on continue="exclusive" event="end"/>,这样就会对下面的节点生成异步job,让jobexecutor完成。

流程定义

 

 

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

 

<process name="AsyncFork" xmlns="http://jbpm.org/4.0/jpdl">

 

    <start g="22,69,80,40">

       <transition to="fork"/>

    </start>

 

    <fork g="99,68,80,40" name="fork">

      <on continue="exclusive" event="end"/>

    <transition g="122,41:" to="ship goods"/>

    <transition g="123,142:" to="send bill"/>

    </fork>

 

    <java class="org.jbpm.examples.async.fork.Application" g="159,17,98,50" method="shipGoods" name="ship goods">

       <transition g="297,42:" to="join"/>

    </java>

 

  <java class="org.jbpm.examples.async.fork.Application" g="159,117,98,50" method="sendBill" name="send bill">

    <transition g="297,141:" to="join"/>

  </java>

 

  <join g="274,66,80,40" name="join">

      <transition name="to java1" to="java1" g="-53,-17"/>

  </join>

 

  <end g="498,72,48,48" name="end"/>

   <java name="java1" g="356,69,92,52" class="org.jbpm.examples.async.fork.Application" method="sendApple">

      <transition name="to end" to="end" g="-41,-17"/>

   </java>

</process>

Application:输出一条打印语句,然后等待5s,模拟并发的任务

public class Application implements Serializable {

 

  private static final long serialVersionUID = 1L;

 

     public void shipGoods() {

       // assume automatic calculations here

         try {

            System.out.println("正在输出PDF...... ");

              Thread.sleep(4000);

              System.out.println("输出PDF完毕!!");

           } catch (InterruptedException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

     }

 

     public void sendBill() {

       // assume automatic calculations here

      try {

                System.out.println("正在输出Primes...... ");

              Thread.sleep(6000);

              System.out.println("输出Primes完毕!!");

           } catch (InterruptedException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

     }

     public void sendApple() {

        // assume automatic calculations here

         try {

                   System.out.println("正在输出Apple...... ");

                  Thread.sleep(5000);

                  System.out.println("输出Apples完毕!!");

              } catch (InterruptedException e) {

                  // TODO Auto-generated catch block

                  e.printStackTrace();

              }

      }

}

运行

1.       jbpm.cfg.xml 添加  <import resource="jbpm.jobexecutor.cfg.xml" />

2.添加文件jbpm.jobexecutor.cfg.xml。内容如下:

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

<jbpm-configuration> 

<process-engine-context> 

<job-executor threads="2" idle="15000" idle-max="20000" lock-millis="25000" /> 

</process-engine-context> 

</jbpm-configuration> 

3.部署流程到数据库

4.运行流程。

public static void main(String[] args) {

       // TODO Auto-generated method stub

       ProcessEngine processEngine = null;

       ExecutionService executionService = null;

       ManagementService managementService=null;

      

       Configuration configuration= new Configuration();

       processEngine = configuration.buildProcessEngine();

      

       executionService = processEngine.getExecutionService();

       managementService=processEngine.getManagementService();

      

        ProcessInstance processInstance=

            executionService.startProcessInstanceByKey("AsyncFork");

    }

效果如下:


 

11:35:51,578 FIN   | [ExecuteActivity] executing activity(ship goods)

正在输出PDF......

11:35:51,609 FIN     | [ExecuteJobCmd] executing job message[103]...

正在输出Primes......

11:35:51,625 FIN     | [ExecuteActivity] executing activity(send bill)

输出PDF完毕!!

11:35:55,578 FIN   | [ExecuteActivity] executing activity(join)

输出Primes完毕!!

11:35:57,625 FIN     | [ExecuteActivity] executing activity(join)

………

问题是:并没有输出:正在输出Apple......  输出Apples完毕!!也就是说流程推进到join节点那,就进行不下去了。

原因:

我断点调试了一下,原来是异步环境下,线程A对节点状态做的修改不能同步到线程B中的。而join是当两个节点的状态都是inactive-join时,才能继续向下推进。

假如线程A对应节点1,线程B对应node2,两个线程同时启动。A先修改node1的状态为inactive-join,然后join会判断是否都完成。然后线程B修改node2的状态为inactive-join,但是在接着join判断都完成时,由于node1的状态并没有同步过来,导致join节点完成继续向下推进。

求助

大家看看是我代码或配置的问题,还是别的方面的原因,希望大家给点建议。

0
0
分享到:
评论

相关推荐

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

    jbpm4是一款强大的工作流管理系统,它提供了流程定义、流程实例管理、任务处理以及流程监控等一系列功能。在“jbpm4流程提交及执行完整代码”这个压缩包中,包含了实现jbpm4流程提交和执行所需的若干关键文件。下面...

    extjs jbpm4流程设计器

    ExtJS是一个JavaScript库,专用于创建富客户端用户界面,而jBPM4则是一个工作流管理系统,用于管理和执行业务流程。本篇文章将深入探讨这两个技术如何结合以实现"extjs jbpm4流程设计器"的功能。 首先,ExtJS是一个...

    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实践之:并发子流程的实现.doc

    在JBPM中,处理并发子流程是实现复杂业务逻辑的重要一环。本文将深入探讨如何使用TaskNode来实现并发子流程的模拟执行。 首先,我们需要在数据库中准备至少三个流程定义,包括一个主流程和两个子流程。发布这些流程...

    jbpm4 完整的请假流程

    这个“jbpm4 完整的请假流程”是一个示例项目,旨在帮助初学者理解和实践jbpm4在处理业务流程,尤其是请假申请流程中的应用。在这个项目中,可能包含了流程定义、流程实例的创建与管理、任务分配与审批等一系列功能...

    jbpm4jbpm5

    jbpm4jbpm5是关于jbpm流程管理框架的专题,涵盖了jbpm4和jbpm5两个主要版本。jbpm是一个开源的工作流管理系统,用于帮助开发者实现业务流程自动化。以下是基于给定文件的信息,深入解析jbpm4和jbpm5的知识点: 1. *...

    JBPM4.4完整可用审批流程

    3. **SQL脚本**:用于创建和初始化数据库表的SQL文件,这是JBPM4运行的基础,因为流程实例、任务和其他元数据需要存储在数据库中。 4. **测试用例**:可能包含测试流程执行和审批逻辑的JUnit或其他测试框架的测试类...

    JBoss JBPM4请假流程示例

    这个示例是关于如何在JBoss JBPM4平台上实现一个简单的请假流程,帮助开发者了解如何定义、执行和管理业务流程。 在JBoss JBPM4中,一个流程通常由一系列任务组成,这些任务可以由系统自动执行,也可以由人参与完成...

    JBPM流程引擎资料

    JBPM是业务流程管理(BPM)领域的一个灵活且强大的开源工作流引擎,它主要用于建模、执行和监控业务流程。文档《JBPM流程引擎资料》详细介绍了如何利用JBPM开发流程应用,涵盖了从框架构造到节点处理的方方面面。 ...

    JBPM4 开发文档 实例 流程

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

    jbpm4流程推进序列图

    jbpm4流程推进序列图

    jbpm工作流程的说明文档

    【jbpm工作流程详解】 jbpm,全称为Java Business Process Management,是一款开源的业务流程管理框架,专注于工作流和服务协作领域。jbpm以其灵活性和可扩展性,为开发者提供了执行流程语言,使得业务流程能够被...

    jbpm4.4流程图

    jbpm4.4是JBoss企业级业务流程管理(Business Process Management)套件的一个版本,它主要用于设计、执行和管理业务流程。在这个“jbpm4.4流程图”中,我们关注的是如何通过图形化的方式来理解和操作这些流程。 ...

    jbpm工作流程

    - **jbpm工作流入门教程.pdf**:这可能是关于jbpm基础知识和实践操作的指南,包括流程设计、部署、执行等。 - **jb51.net.txt**:可能包含jb51网站上的相关文章链接或教程摘要,jb51.net是一个技术分享平台。 - *...

    JBPM 流程 监控 的实现

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

    jbpm4流程启动序列图

    jbpm4流程启动序列图

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

    jBPM4作为该系列的一个版本,提供了一套完整的流程管理和执行框架,允许开发者构建灵活的工作流应用,以实现业务流程自动化。本指南由胡奇编写,旨在为开发者提供一个全面的参考,帮助他们快速学习和掌握使用jBPM4...

    JBPM4 常用表结构及其说明

    JBPM4是JBPM(Java Business Process Model)的一个版本,主要用于提供业务流程管理的功能。它通过一组数据库表来支持工作流的执行与跟踪。本文将详细介绍JBPM4中的常用表结构及其用途。 #### 一、资源库与运行时表...

    jbpm业务流程

    4. **持久化**:jbpm使用Hibernate作为默认的数据持久化层,确保流程实例和相关数据在系统重启后仍能恢复。 5. **监控和管理**:jbpm提供了一个Web管理控制台,用于监控流程实例的状态、查看流程图、跟踪历史记录等...

    应用jBPM4解决中国特色的流程需求

    标题“应用jBPM4解决中国特色的流程需求”和描述“应用jBPM4解决中国特色的流程需求,中国特色流程解决思路。”,以及标签“jbpm4 会签流程 会签”共同指向了探讨如何使用jBPM4这一工作流管理系统,来应对中国在工作...

Global site tag (gtag.js) - Google Analytics