最近由于工作上的需要,想用jbpm4实现自动节点的并发运行,首先考虑的就是fork和join节点,但是并没有达到我想看到的线程级别的并发。
先说一下的我运行的例子吧!
实验思路:设置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节点完成继续向下推进。
求助
大家看看是我代码或配置的问题,还是别的方面的原因,希望大家给点建议。
分享到:
相关推荐
jbpm4是一款强大的工作流管理系统,它提供了流程定义、流程实例管理、任务处理以及流程监控等一系列功能。在“jbpm4流程提交及执行完整代码”这个压缩包中,包含了实现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...
在JBPM中,处理并发子流程是实现复杂业务逻辑的重要一环。本文将深入探讨如何使用TaskNode来实现并发子流程的模拟执行。 首先,我们需要在数据库中准备至少三个流程定义,包括一个主流程和两个子流程。发布这些流程...
这个“jbpm4 完整的请假流程”是一个示例项目,旨在帮助初学者理解和实践jbpm4在处理业务流程,尤其是请假申请流程中的应用。在这个项目中,可能包含了流程定义、流程实例的创建与管理、任务分配与审批等一系列功能...
jbpm4jbpm5是关于jbpm流程管理框架的专题,涵盖了jbpm4和jbpm5两个主要版本。jbpm是一个开源的工作流管理系统,用于帮助开发者实现业务流程自动化。以下是基于给定文件的信息,深入解析jbpm4和jbpm5的知识点: 1. *...
3. **SQL脚本**:用于创建和初始化数据库表的SQL文件,这是JBPM4运行的基础,因为流程实例、任务和其他元数据需要存储在数据库中。 4. **测试用例**:可能包含测试流程执行和审批逻辑的JUnit或其他测试框架的测试类...
这个示例是关于如何在JBoss JBPM4平台上实现一个简单的请假流程,帮助开发者了解如何定义、执行和管理业务流程。 在JBoss JBPM4中,一个流程通常由一系列任务组成,这些任务可以由系统自动执行,也可以由人参与完成...
JBPM是业务流程管理(BPM)领域的一个灵活且强大的开源工作流引擎,它主要用于建模、执行和监控业务流程。文档《JBPM流程引擎资料》详细介绍了如何利用JBPM开发流程应用,涵盖了从框架构造到节点处理的方方面面。 ...
- **部署流程**:通过deploy操作,会在相应的表中创建记录,如jbpm4_deployment、jbpm4_deployprop和jbpm4_lob。 - **启动流程实例**:调用startProcessInstanceByKey方法,会在执行表jbpm4_execution、历史记录表...
jbpm4流程推进序列图
【jbpm工作流程详解】 jbpm,全称为Java Business Process Management,是一款开源的业务流程管理框架,专注于工作流和服务协作领域。jbpm以其灵活性和可扩展性,为开发者提供了执行流程语言,使得业务流程能够被...
jbpm4.4是JBoss企业级业务流程管理(Business Process Management)套件的一个版本,它主要用于设计、执行和管理业务流程。在这个“jbpm4.4流程图”中,我们关注的是如何通过图形化的方式来理解和操作这些流程。 ...
- **jbpm工作流入门教程.pdf**:这可能是关于jbpm基础知识和实践操作的指南,包括流程设计、部署、执行等。 - **jb51.net.txt**:可能包含jb51网站上的相关文章链接或教程摘要,jb51.net是一个技术分享平台。 - *...
4. **集成第三方监控工具**:可以将JBPM与像Prometheus、ELK Stack(Elasticsearch、Logstash、Kibana)等监控工具集成,通过这些工具的强大分析能力来实现对JBPM流程的性能监控和故障排查。 5. **扩展jbpm-console...
jbpm4流程启动序列图
jBPM4作为该系列的一个版本,提供了一套完整的流程管理和执行框架,允许开发者构建灵活的工作流应用,以实现业务流程自动化。本指南由胡奇编写,旨在为开发者提供一个全面的参考,帮助他们快速学习和掌握使用jBPM4...
JBPM4是JBPM(Java Business Process Model)的一个版本,主要用于提供业务流程管理的功能。它通过一组数据库表来支持工作流的执行与跟踪。本文将详细介绍JBPM4中的常用表结构及其用途。 #### 一、资源库与运行时表...
4. **持久化**:jbpm使用Hibernate作为默认的数据持久化层,确保流程实例和相关数据在系统重启后仍能恢复。 5. **监控和管理**:jbpm提供了一个Web管理控制台,用于监控流程实例的状态、查看流程图、跟踪历史记录等...
标题“应用jBPM4解决中国特色的流程需求”和描述“应用jBPM4解决中国特色的流程需求,中国特色流程解决思路。”,以及标签“jbpm4 会签流程 会签”共同指向了探讨如何使用jBPM4这一工作流管理系统,来应对中国在工作...