`
jeffen2006
  • 浏览: 254915 次
  • 性别: 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引用图片

相关推荐

    Fork/Join例子

    Fork/Join例子

    fork/join 实例

    fork join 框架 生产使用实例,可以直接修改配置,实现业务。

    Fork/Join框架Package jsr166y

    Fork/Join框架Package jsr166y是Java 7并行编程类的的初步版本(Preliminary versions of classes targeted for Java 7.)

    java NIO用法及java fork/join 用法源码工程

    1.ServerSocketChannel与SocketChannel通讯 2.java Fork/Join 与ThreadPool使用

    Java中的Fork/Join框架

     fork/join框架与其它ExecutorService的实现类相似,会给线程池中的线程分发任务,不同之处在于它使用了工作窃取算法,所谓工作窃取,指的是对那些处理完自身任务的线程,会从其它线程窃取任务执行。  fork/join...

    JDK7中的ForkJoin模式

    随着多核时代的来临,软件开发人员不得不开始关注并行编程领域。...本文将介绍使用 JDK 7 中 Fork/Join 模式的方法和其他相关改进。阅读本文之后,读者将能够独立地在软件开发中使用 Fork/Join 模式来改进程序的性能。

    java Fork Join框架及使用

    java Fork Join框架及使用,java自带的多线程框架,来处理多线程的问题

    Java Fork/Join框架

    Fork/Join框架是Java7中新增的一项特性,也是Java7平台的其中一项主要改进。下面我们就来简单探讨下Java的Fork/Join框架

    java fork-join框架介绍

    fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核处理器的优势,编写出并行执行的程序,提高应用程序的性能;设计的目的是为了处理那些可以被递归拆分的任务。

    Fork:join框架与CompleteableFuture源码解析.pptx

    全网第一篇通过图文介绍Fork/Join框架与CompleteableFuture的PPT

    浅谈Java Fork/Join并行框架

    主要介绍了浅谈Java Fork/Join并行框架,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    ForkJoinUtil.java,一个分而治之的框架工具类

    Fork/Join框架的测试demo,含源代码。 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过Fork和Join这两个...

    Java通过Fork/Join优化并行计算

    主要为大家详细介绍了Java通过Fork、Join来优化并行计算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Fork-Join框架演示

    Java Fork-Join 论文 排序

    Java并发Fork and join

    Java并发网文归并总结。Fork and join,比较详细

    译文:Fork and Join: Java Can Excel at Painless Parallel Programming Too!

    译文:Fork and Join: Java Can Excel at Painless Parallel Programming Too!(Fork and Join Java也可以轻松地编写并发程序)

    Fork Join框架机制详解.docx

    Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务的执行结果得到这个大任务的最终结果。 这种机制策略在分布式数据库中非常常见,数据分布在不同的数据库的...

    eclipse-collections-forkjoin-7.1.2-API文档-中文版.zip

    赠送jar包:eclipse-collections-forkjoin-7.1.2.jar; 赠送原API文档:eclipse-collections-forkjoin-7.1.2-javadoc.jar; 赠送源代码:eclipse-collections-forkjoin-7.1.2-sources.jar; 赠送Maven依赖信息文件:...

    ForkJoin并发框架入门示例

    介绍了ForkJoin并发框架,供有java基础者学习,工作配合使用,附件带有PPT,介绍并发与并行区别,和ForkJoin代码范例,资源来自网络,分享分享!

Global site tag (gtag.js) - Google Analytics