`
jeffen2006
  • 浏览: 259645 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用fork/join的常见错误

阅读更多

在实际的流程设计中常常会出现如下的流程:

看上去没什么问题,那么开始编程

xml 代码
  1. <!---->xml version="1.0" encoding="UTF-8"?>  
  2. <process-definition xmlns="" name="yytest">  
  3.    <start-state name="start">  
  4.       <transition name="" to="f1">transition>  
  5.    start-state>  
  6.    <fork name="f1">  
  7.       <transition name="to_s1" to="s1">transition>  
  8.       <transition name="to_j1_1" to="j1">transition>  
  9.    fork>  
  10.    <state name="s1">  
  11.       <transition name="" to="f2">transition>  
  12.    state>  
  13.    <fork name="f2">  
  14.       <transition name="to_j1_2" to="j1">transition>  
  15.       <transition name="to_s2" to="s2">transition>  
  16.    fork>  
  17.    <state name="s2">  
  18.       <transition name="to_j1_3" to="j1">transition>  
  19.    state>      
  20.    <join name="j1">  
  21.       <transition name="" to="s3">transition>  
  22.    join>  
  23.    <state name="s3">  
  24.       <transition name="" to="end">transition>  
  25.    state>  
  26.    <end-state name="end">end-state>  
  27.   
  28. process-definition>  
java 代码
  1. private static void run(){   
  2.         JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();   
  3.         try {   
  4.             long processInstanceId =1;   
  5.                processInstance = jbpmContext.loadProcessInstance(processInstanceId);   
  6.                Token root = processInstance.getRootToken();   
  7.                root.signal();   
  8.                Token to_s1 = root.getChild("to_s1");   
  9.                Token to_j1_1 = root.getChild("to_j1_1");   
  10.                System.out.println("root:"+root.getNode());//root:Fork(f1)   
  11.                System.out.println("to_s1:"+to_s1.getNode());//to_s1:State(s1)   
  12.                System.out.println("to_j1_1:"+to_j1_1.getNode());//to_j1_1:Join(j1)   
  13.                to_s1.signal();   
  14.                Token to_s2 = to_s1.getChild("to_s2");   
  15.                Token to_j1_2 = to_s1.getChild("to_j1_2");   
  16.                System.out.println("root:"+root.getNode());//root:Fork(f1)   
  17.                System.out.println("to_s2:"+to_s2.getNode());//to_s2:State(s2)   
  18.                System.out.println("to_j1_2:"+to_j1_2.getNode());//to_j1_2:Join(j1)   
  19.                to_s2.signal();   
  20.                System.out.println("root:"+root.getNode());   
  21.                //注意这里,我们的目的是所有的分支已经结束,root应该到达Join(j1)。但是实际运行结果为root:Fork(f1)   
  22.             }finally {   
  23.               jbpmContext.close();   
  24.             }   
  25.   
  26.     }     

为什么所有的子令牌都结束了,根令牌仍然在fork呢?原因就是fork和join没有配对使用。所以看似正确的流程也一定要经过严格的测试,绝不能想当然。重新编写流程定义文件:

xml 代码
  1. <!---->xml version="1.0" encoding="UTF-8"?>  
  2. <process-definition xmlns="" name="yytest">  
  3.    <start-state name="start">  
  4.       <transition name="" to="f1">transition>  
  5.    start-state>  
  6.    <fork name="f1">  
  7.       <transition name="to_s1" to="s1">transition>  
  8.       <transition name="to_j1_1" to="j1">transition>  
  9.    fork>  
  10.    <state name="s1">  
  11.       <transition name="" to="f2">transition>  
  12.    state>  
  13.    <fork name="f2">  
  14.       <transition name="to_j2_1" to="j2">transition>  
  15.       <transition name="to_s2" to="s2">transition>  
  16.    fork>  
  17.    <state name="s2">  
  18.       <transition name="to_j2_2" to="j2">transition>  
  19.    state>      
  20.    <join name="j2">  
  21.         <transition name="to_j1_2" to="j1">transition>  
  22.    join>  
  23.    <join name="j1">  
  24.       <transition name="" to="s3">transition>  
  25.    join>  
  26.    <state name="s3">  
  27.       <transition name="" to="end">transition>  
  28.    state>  
  29.    <end-state name="end">end-state>  
  30.       
  31.   
  32. process-definition>  
java 代码
  1. private static void run(){   
  2.         JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();   
  3.         try {   
  4.             long processInstanceId =1;   
  5.                processInstance = jbpmContext.loadProcessInstance(processInstanceId);   
  6.                Token root = processInstance.getRootToken();   
  7.                root.signal();   
  8.                Token to_s1 = root.getChild("to_s1");   
  9.                Token to_j1_1 = root.getChild("to_j1_1");   
  10.                System.out.println("root:"+root.getNode());//root:Fork(f1)   
  11.                System.out.println("to_s1:"+to_s1.getNode());//to_s1:State(s1)   
  12.                System.out.println("to_j1_1:"+to_j1_1.getNode());//to_j1_1:Join(j1)   
  13.                to_s1.signal();   
  14.                Token to_s2 = to_s1.getChild("to_s2");   
  15.                Token to_j2_1 = to_s1.getChild("to_j2_1");   
  16.                System.out.println("root:"+root.getNode());//root:Fork(f1)   
  17.                System.out.println("to_s2:"+to_s2.getNode());//to_s2:State(s2)   
  18.                System.out.println("to_j2_1:"+to_j2_1.getNode());//to_j2_1:Join(j1)   
  19.                to_s2.signal();   
  20.                System.out.println("root:"+root.getNode());   
  21.                //正确:root:State(s3)   
  22.             }finally {   
  23.               jbpmContext.close();   
  24.             }   
  25.   
  26.     }     
  • 描述: error
  • 大小: 26.1 KB
  • 描述: ok
  • 大小: 27.5 KB
分享到:
评论
2 楼 jeffen2006 2006-12-05  
如何上传呢?我点插入图片的按钮,弹出的对话框中没有上传的功能,我就copy的地址。
1 楼 抛出异常的爱 2006-12-05  
D:/eclipse/jbpm/jbpm-starters-kit-3.1.2/jbpm-designer/workspace/yytestjbpm/processes/yytest/processimage.jpg

注意先上传之后再用网络URL引用图片

相关推荐

    Java多线程编程详解:核心概念与高级技术应用

    内容涵盖线程的概念与重要性、创建线程的方式、线程的生命周期与基本控制方法、线程同步与死锁、线程间通信、线程池与 Executor框架、并发集合与原子类、未来与 Callable接口、Fork/Join框架以及并发编程的最佳实践...

    多线程问题

    在实现时,fork/join框架使用工作窃取算法来平衡线程的工作负载。 Java虚拟机(JVM)在处理线程时也存在一些限制和挑战,比如线程数目的上限、线程上下文切换的开销等。随着Java虚拟机版本的更新,对线程的支持也在...

    jdk-8u301-linux-x64.tar.zip

    对于Linux用户来说,这个版本的JDK是通过.tar.gz格式提供的,这种格式是Linux系统常见的归档和压缩方式,需要使用tar命令进行解压。 为了在Linux系统上安装这个JDK,首先需要解压缩文件。可以使用以下命令: ```...

    Java 7 Concurrency Cookbook

    Fork/Join框架是为了解决并行计算问题而设计的一个框架,它能够将大任务拆分成小任务进行处理,然后再将结果合并起来。这种拆分任务的方式非常适合多核处理器的并行计算环境。 Java 7的并发包还引入了一些新的并发...

    java的大数据读写

    可以使用`ExecutorService`和`Future`来并行处理数据块,或者使用`Fork/Join`框架进行工作窃取。 8. **性能优化**:处理大数据时,性能至关重要。这包括选择合适的I/O模式(同步或异步),减少磁盘I/O次数,使用...

    jdk-8u221-linux-x64.tar.zip

    以及改进的并发库,如Fork/Join框架和Parallel Streams。此外,Java 8还增强了Date和Time API,提供了一个新的模块系统,并对反射和注解处理进行了优化。 在开发环境中,选择Sun JDK还是Oracle OpenJDK主要取决于...

    深入理解JVM内幕:从基本结构到Java 7新特性

    2. 并发改进:如Fork/Join框架,用于高效地执行并行任务,尤其适用于可以分解为子任务的问题。 3. 文件系统API(NIO.2):提供了对文件系统的访问,支持文件路径操作,异步I/O,以及其他增强功能。 4.钻石操作符()...

    sva classical q&a

    - **使用虚拟接口**:虚拟接口可以作为测试平台和RTL之间的桥梁,确保所有信号的访问都是通过统一的方式进行的,从而减少了错误的可能性。 - **同步信号**:确保所有关键信号都在时钟边缘上进行更新,而不是在任意...

    jdk_1.8_linux_x64

    3. **并发改进**:包括Fork/Join框架,ConcurrentHashMap的增强,以及新的原子类。 4. **类型注解**:增强了代码的静态分析和工具支持。 5. **模块系统**:Jigsaw项目的一部分,虽然在JDK 9才正式引入,但JDK 8已经...

    Hive编程指南+HIVE从入门到精通+Hive高级编程+Apache Oozie

    3. **控制结构**: 使用决策、fork/join和重试等控制流来构建复杂的逻辑流程。 4. **调度与触发**: 设置定时器或依赖于其他作业的完成来触发工作流。 5. **监控与管理**: 监控工作流状态,管理和回滚失败的任务。 ...

    JavaJDK-1.8中文帮助文档

    这些知识点构成了Java 8的核心特性,通过阅读和理解这份中文帮助文档,开发者能够更好地掌握Java 8的使用技巧,提高编程效率,同时避免常见错误,编写出更高质量的Java应用。这份文档对于初学者和经验丰富的开发者都...

    C.tar.gz_SUM

    例如,使用Java的Fork/Join框架或者并发流。 3. **分布式计算**:在大数据场景下,可以借助Apache Hadoop或Spark等框架,在分布式集群上进行SUM计算。 4. **错误处理**:在处理用户输入或文件数据时,可能需要对非...

    福利--JAVA高手真经,视频及随书光盘

    10. **Java并发编程**:深入理解并发编程的概念,如线程池、Future、Callable接口,以及并发工具类如ExecutorService和Fork/Join框架。 配合视频教程,这些理论知识将通过实践案例得到巩固。你可以期待通过这些学习...

    jdk1.7.0_51.zip

    - **Fork/Join框架**:这是并行计算的一种新方法,用于将大任务分解成小任务并行处理。 - **动态类型语言支持**:通过 invokedynamic 字节码指令,JDK 7支持更多的动态编程语言,如Groovy和JRuby。 - **try-with-...

    多线程实现脏字及不和谐文字的过滤(高效)

    6. **性能优化**:除了多线程,还可以结合其他优化手段,比如使用哈希表(HashSet)或字典树(Trie)来加速关键词查找,或者使用并行计算框架(如Java的Fork/Join框架)进一步提升性能。 7. **异常处理**:确保每个...

    关于《Java那么健壮,怎么会挂?》的1000条回复Jav

    8. **并发编程模型**:理解线程池的工作原理,如ExecutorService,以及Fork/Join框架和CompletableFuture,可以帮助编写高效的并发代码。 9. **性能监控**:使用JConsole、VisualVM等工具监控JVM的运行状态,可以...

    java学习材料499篇文章

    3. **并发编程**:并发集合、并发工具类、并发模型(如Fork/Join框架)。 4. **数据库连接**:JDBC的使用,事务处理,SQL查询优化。 这些文章可能还涵盖了面试题解析,项目实战经验分享,以及Java开发者应掌握的...

    java面试大全,从java基础到微服务,2月1号总结完毕版本

    - **Fork/Join**:一种分治算法的思想,用于高效地并行处理任务。 - **原理**:将大任务分解为若干个小任务(Fork),各个小任务并行执行,最后合并结果(Join)。 - **应用案例**:适用于大量数据的并行处理,...

    Java语言规范.基于 Java SE 8

    基于 Java SE 8》这本书,可以帮助开发者深入理解Java语言的本质,避免常见错误,同时掌握最新的编程实践。通过这本书,读者可以全面了解Java编程的各种细节,从而成为一名更专业的Java开发者。

Global site tag (gtag.js) - Google Analytics