`
上杉t
  • 浏览: 32593 次
文章分类
社区版块
存档分类
最新评论

浅谈jbpm流程收回和回退的控制方法(二:分支流程的控制)

阅读更多

        (本篇文章的回退实现,是建立在前一篇文章提到的功能实现之上,重复的地方不在详说了)

        终于有一天,一个同事跑来告诉我,流程回退功能出问题了,并告诉我他用了分支节点.看来又到了解事实真相,解决问题的时候了.先画个流程草图.

                          a---b---fork---d---join---f---g

                                       \            /

                                         c-------e

        

          经过测试发现对分支的回退会出现两个问题:

          1.当流程执行到分支内节点时(d,c,e),如果要退回到b任务,并把分支内的任务关闭掉,当再次进入分支节点后,流程就只能运行到join节点,不能到达F.

          2.当流程执行到F时,如果要将流程回退到一个分支内的任务上(d,c,e),流程就也只能运行到join节点,不能再到达F.


          看来只是开关一下任务实例,再把令牌指到fork是不能实现涉及分支的回退功能.其根本原因就是我们没有对分支中的子令牌进行控制.所以我们先简单的分析jbpm分支的具体实现.


          当流程执行到fork时,会根据分支的个数创建几个子令牌(本例是创建2个),子令牌会各自流转,直到到达join节点.join节点会检查子令牌是否都到达join节点,如果是就流转主令牌到点一个节点,如果不是就继续等待其他子令牌.完成这个逻辑主演是依靠Token的isAbleToReactivateParent属性来完成这个功能.isAbleToReactivateParent这个属性的含义可以理解成,当前持有这个属性的子令牌是否可以激活(恢复)其父令牌.所以这个属性只有分支的子令牌才具有.

 

            isAbleToReactivateParent在fork创建分支令牌为true,当子令牌到达join是会被设为false.具体说一下过程(详细的可以看看join的execute方法)每一个子令牌到达join节点,都会触发join的execute方法.该方法的第一步就是检测子令牌的isAbleToReactivateParent是否为true,不是ture你这个子令牌就什么都别想干了.当为true时子令牌才有权尝试(仅仅是尝试)驱动一下父令牌.

 

            子令牌过这第一关,isAbleToReactivateParent就会被赋值false.(每个子令牌只有一次机会去见他的父亲)下面还要过好多关(这里就不详细说了,和本文无关了,主要还是检测子令牌能不能驱动主令牌).所有的关卡都通过,终于来到他伟大的父令牌面前了,呵呵.这时这个父令牌会找到他的全部儿子,检查儿子们的isAbleToReactivateParent属性是否都为fasle(看看还有没有想见他的儿子).如果还有为true的子令牌,说明还有儿子没来那.父令牌会等待他来.要是全为fasle.那就是全部儿子都见过父亲了,父令牌就可以说白白了,奔向下一个节点.

               

             不小心编了故事讲完了.下面我们分析一下最开始出现的两个问题:

             1.当流程执行到分支内节点时(d,c,e),如果要退回到b任务,并把分支内的任务关闭掉,当再次进入分支节点后,流程就只能运行到join节点,不能到达F是问什么那 . 在这里虽然我们关闭里分支内的任务,但没有让两个子令牌放弃见他们老爸的想法.所以当你再次由b进入分支时.又创建了两个子令牌.这个老爸现在有4个儿子了.其中先前的两个儿子想见老爸.却永远都见不到,父令牌会在join那一个劲的等啊等.你流程就跟着一起等吧.所以要从分支往分支外跳的时候,除了杀掉任务,也别忘了让子令牌放弃见老爸的想法.isAbleToReactivateParent=false.

             2.当流程执行到F时,如果要将流程回退到一个分支内的任务上(d,c,e),流程就也只能运行到join节点,不能再到达F . 这个就很好解释了,你从f跳会分支里.历史任务开启.要命的是这个任务上的子令牌不想见父令牌(此时isAbleToReactivateParent=false).这个子令牌到了join那,第一关都过去.怎么有机会让他老爸走人那.所以,开启分支里的任务时,不要忘记将该任务的令牌属性isAbleToReactivateParent=true.这样他才能见到父令牌让他走人.

 

 

                   匆忙中,写完了这个文章.会有不详尽,而表达啰嗦的地方.如果有疑问.我会回答补充.另外在查看join节点代码时,发现有个nOutOfM属性,应该是在定义流程模板的时候可以定义,这个属性可以设定一个值,代表.有一个令牌到达join后就可以驱动父令牌了,如果是nOutOfM=3,那就是有3个分支线到达就可以驱动父令牌.要是用分支做会签,这个属性是比较有用的,

分享到:
评论
6 楼 shanyuxiyun 2012-03-10  
非常感谢  貌似很有道理  不知道 是不是这样?
5 楼 hl20913538 2009-05-12  
很好,今天学习了!
期待你的第三部-《子流程的控制》
4 楼 sevencolor 2009-02-19  
llandyl 写道

如果能使用程序说明一下,就更好了!

是啊,能用程序演示的话更清楚点。
3 楼 linliangyi2007 2008-10-21  
nOutOfM 属性是有啊,但貌似没有启用!我看的是3.2.2的代码,这个属性可以运行时设置,但没有提供持久化属性,这意味着没法再配置流程的时候决定。不知我是否看漏了??

jBPM代码中有很多隐式的属性都没有对外开放,至少在他的designer中是看不到的,感觉像在挖宝,有趣啊!
2 楼 rking0228 2008-08-10  
很经典 明天回公司试试
1 楼 llandyl 2008-08-07  
如果能使用程序说明一下,就更好了!

相关推荐

    JBPM4.4实现一种无需指定上一节点(previous activity)的流程驳回(回退)

    标题中的“JBPM4.4实现一种无需指定上一节点(previous activity)的流程驳回(回退)”是指在使用JBPM(Java Business Process Management)4.4版本时,设计了一个特殊的流程控制机制,允许用户在执行流程过程中进行回...

    JBPM流程引擎资料

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

    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流程引擎设计 工作流资料

    9. **版本管理**:JBPM提供了版本控制功能,可以对流程模型进行版本管理,便于流程的更新和回溯,同时保护了已部署流程的稳定性。 综上所述,JBPM流程引擎设计是企业信息化建设中的关键技术,它为企业构建灵活、可...

    揭秘jbpm流程引擎内核设计思想及构架.doc

    jbpm流程引擎内核的设计思想和结构是jbpm流程引擎的核心部分,掌握了jbpm流程引擎内核的设计思想和结构,才能真正理解jbpm流程引擎的工作原理,并且能够更好地应用jbpm流程引擎来解决实际问题。 流程引擎内核的设计...

    JBPM 流程 监控 的实现

    总的来说,虽然JBPM自身未提供内置的流程监控功能,但通过上述方法的组合和定制,完全可以构建出满足企业需求的流程监控系统。开发者可以根据具体的需求和团队的技术栈,选择适合的方式来实现JBPM流程的监控,以确保...

    jbpm流程设计器

    jbpm流程设计器是一款强大的工具,专门用于设计和构建jbpm工作流。jbpm(Java Business Process Management)是一个开源的企业级工作流管理系统,它允许开发者通过定义业务流程来自动化企业的业务操作。jbpm流程设计...

    揭秘jbpm流程引擎内核.pdf

    这个教程“揭秘jbpm流程引擎内核.pdf”很可能是对jbpm核心机制的详细解析,包括引擎的内部结构、执行流程、任务调度以及优化技巧等内容,对于学习和掌握jbpm具有极高的价值。通过阅读这份教程,你将能够深入理解jbpm...

    JBPM流程监控的实现过程

    JBPM使用三张核心表来记录流程定义、实例和任务实例的信息:`JBPM_PROCESSDEFINITION`、`JBPM_PROCESSINSTANCE` 和 `JBPM_TASKINSTANCE`。 1. **获取所有已发布流程的最新版本** 通过`JbpmContext`对象可以访问到...

    JBPM流程代码演示

    【JBPM流程代码演示】是关于使用JBPM(Java Business Process Management)框架进行流程管理的实践教程。JBPM是一个开源的工作流管理系统,它允许开发者设计、执行和管理业务流程。本教程通过一系列代码示例,旨在...

    jbpm4.4 请假的例子,包含Jar包,实现回退功能可以运行

    开发者可以通过它了解如何设计和实现一个实际的业务流程,同时掌握回退功能的实现方法。 总之,JBPM4.4的请假流程实例是一个全面展示流程管理能力的案例,它涵盖了从流程设计、部署到运行的全过程,并特别强调了回...

    JBPM流程框架源码

    - **事件处理**:支持信号、时间事件,用于流程控制和异常处理。 - **监控与审计**:提供日志和报表,便于分析流程执行情况。 3. **"leave"示例解析** - **请假流程**:这个示例通常会涉及申请、审批、通知等...

    JBPM7基础开发

    流程是做事的方法,包含做事的顺序和做事的内容。例如:请假流程开始----请假人填写请假单-----组长或直属领导审批----人事部门审批------结束。 概念4:流程定义 流程定义是用标准化语言(例如:BPMN 2.0)或图标...

    jbpm4.4流程图

    3. **网关**:用于控制流程的分支和合并,如并行网关实现任务并行执行,决策网关根据条件决定流程走向。 4. **连接线**:指示流程的流转路径,可能带有条件表达式,决定何时从一个活动转移到另一个。 5. **结束事件*...

    JOffice2中的JBPM4的任务回退实现

    本文将深入探讨如何在JOffice2中实现JBPM4任务的回退功能,这在处理复杂流程时尤其重要,允许用户纠正错误或根据需要调整流程方向。 任务回退在JOffice2中有两种主要的实现方式: 1. **完成当前任务并生成新的后退...

    MyEclipse6.0下Jbpm流程设计器

    【MyEclipse6.0下Jbpm流程设计器】是一个专为MyEclipse6.0集成的业务流程管理(Business Process Management,BPM)工具,主要用于设计和管理Jbpm流程。Jbpm是一个开源的工作流和业务流程管理平台,它提供了一套完整...

    工作流程JBPM工作流管理

    8. **版本控制**:JBPM支持流程模型的版本控制,允许企业在不影响现有流程的情况下进行版本升级和维护。 9. **事件驱动**:通过监听和响应特定事件,如系统事件或业务事件,可以触发流程的执行或改变流程状态。 10...

    jbpm流程部署文件

    jbpm流程部署涉及到的各个环节包括流程模板设计、流程部署、任务配置、节点设置和变量配置,这些都对流程的正确运行至关重要。通过灵活的配置,jbpm能够适应各种复杂的业务场景,实现高效的企业流程管理。在实际操作...

    JBPM4.4完整可用审批流程

    JBPM4.4是JBoss Business Process Management (BPM)平台的一个版本,它是一个开源的企业级BPM解决方案,用于设计、执行和管理业务流程。在这个完整的审批流程工程中,我们看到它采用Maven进行项目构建和依赖管理,...

Global site tag (gtag.js) - Google Analytics