- 浏览: 159527 次
- 性别:
- 来自: 北京
最新评论
-
pg_caolei:
楼主,刚才是为了测试一下提供的功能,不小心点提交了,见谅。呵呵 ...
吐一个泡泡 -
pg_caolei:
[b][/b][i][/i]引用[*][img][/img][ ...
吐一个泡泡 -
logcos:
看不明白。
jbpm 项目实践 1.2 (集成appfuse spring modules) -
flyffa:
sorry,应该是更符合Structured Synchron ...
jbpm 与 工作流模式 鉴别器(Discriminator) -
flyffa:
这个模式好像实现的有问题吧,按照workflow patter ...
jbpm 与 工作流模式 鉴别器(Discriminator)
鉴别器(Discriminator)
Description : The discriminator is a point in a workow process that waits for one of the
incoming branches to complete before activating the subsequent activity. From that moment on
it waits for all remaining branches to complete and \ignores" them. Once all incoming branches
have been triggered, it resets itself so that it can be triggered again (which is important
otherwise it could not really be used in the context of a loop).
描述:多分支汇聚的时候,只有一个分支可以激活所属任务,这个任务激活以后,其他分支的
到来都会被忽略。
流程定义文件
testDiscriminatorScenario1()
节点执行顺序
start --> a --> multichoice --> b --> discriminator --> d
testDiscriminatorScenario2()
节点执行顺序
start --> a --> multichoice --> c --> discriminator --> d
testDiscriminatorScenario3()
节点执行顺序
start --> a --> multichoice --> b --> discriminator --> d
multichoice --> c --> discriminator(废弃)
testDiscriminatorScenario4()
节点执行顺序
start --> a --> multichoice --> b --> discriminator(废弃) --> d
multichoice --> c --> discriminator
testDiscriminatorScenario5()
节点执行顺序
start --> a --> multichoice --> b --> discriminator --> d
multichoice --> c --> discriminator
testDiscriminatorScenario6()
节点执行顺序
start --> a --> multichoice --> b --> discriminator --> d
multichoice --> c --> discriminator
Description : The discriminator is a point in a workow process that waits for one of the
incoming branches to complete before activating the subsequent activity. From that moment on
it waits for all remaining branches to complete and \ignores" them. Once all incoming branches
have been triggered, it resets itself so that it can be triggered again (which is important
otherwise it could not really be used in the context of a loop).
描述:多分支汇聚的时候,只有一个分支可以激活所属任务,这个任务激活以后,其他分支的
到来都会被忽略。
java 代码
- /*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
- package org.jbpm.jpdl.patterns;
- import junit.framework.TestCase;
- import org.jbpm.graph.def.ProcessDefinition;
- import org.jbpm.graph.exe.Token;
- import org.jbpm.graph.node.Join;
- /**
- * http://is.tm.tue.nl/research/patterns/download/swf/pat_9.swf
- */
- public class Wfp09DiscriminatorTest extends TestCase {
- private static ProcessDefinition discriminatorProcessDefinition = createDiscriminatorProcessDefinition();
- public static ProcessDefinition createDiscriminatorProcessDefinition() {
- ProcessDefinition pd = createSynchronizingDiscriminatorProcessDefinition();
- // configure the join as a discriminator
- Join join = (Join) pd.getNode("discriminator");
- join.setDiscriminator(true);
- return pd;
- }
- private static ProcessDefinition synchronizingdiscriminatorProcessDefinition = createSynchronizingDiscriminatorProcessDefinition();
- public static ProcessDefinition createSynchronizingDiscriminatorProcessDefinition() {
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition>" +
- " <start-state name='start'>" +
- " <transition to='a' />" +
- " </start-state>" +
- " <state name='a'>" +
- " <transition to='multichoice' />" +
- " </state>" +
- " <fork name='multichoice'>" +
- " <script>" +
- " <variable name='transitionNames' access='write' />" +
- " <expression>" +
- " transitionNames = new ArrayList();" +
- " if ( scenario == 1 ) {" +
- " transitionNames.add( \"to b\" );" +
- " } else if ( scenario == 2 ) {" +
- " transitionNames.add( \"to c\" );" +
- " } else if ( scenario >= 3 ) {" +
- " transitionNames.add( \"to b\" );" +
- " transitionNames.add( \"to c\" );" +
- " }" +
- " </expression>" +
- " </script>" +
- " <transition name='to b' to='b' />" +
- " <transition name='to c' to='c' />" +
- " </fork>" +
- " <state name='b'>" +
- " <transition to='discriminator' />" +
- " </state>" +
- " <state name='c'>" +
- " <transition to='discriminator' />" +
- " </state>" +
- " <join name='discriminator'>" +
- " <transition to='d' />" +
- " </join>" +
- " <state name='d' />" +
- "</process-definition>"
- );
- return processDefinition;
- }
- public void testDiscriminatorScenario1() {
- ProcessDefinition pd = discriminatorProcessDefinition;
- Token root = Wfp06MultiChoiceTest.executeScenario(pd,1);
- Token tokenB = root.getChild("to b");
- tokenB.signal();
- assertSame( pd.getNode("d"), root.getNode() );
- assertSame( pd.getNode("discriminator"), tokenB.getNode() );
- }
- public void testDiscriminatorScenario2() {
- ProcessDefinition pd = discriminatorProcessDefinition;
- Token root = Wfp06MultiChoiceTest.executeScenario(pd,2);
- Token tokenC = root.getChild("to c");
- tokenC.signal();
- assertSame( pd.getNode("d"), root.getNode() );
- assertSame( pd.getNode("discriminator"), tokenC.getNode() );
- }
- public void testDiscriminatorScenario3() {
- ProcessDefinition pd = discriminatorProcessDefinition;
- Token root = Wfp06MultiChoiceTest.executeScenario(pd,3);
- Token tokenB = root.getChild("to b");
- Token tokenC = root.getChild("to c");
- tokenB.signal();
- assertSame( pd.getNode("d"), root.getNode() );
- assertSame( pd.getNode("discriminator"), tokenB.getNode() );
- assertSame( pd.getNode("c"), tokenC.getNode() );
- tokenC.signal();
- assertSame( pd.getNode("d"), root.getNode() );
- assertSame( pd.getNode("discriminator"), tokenB.getNode() );
- assertSame( pd.getNode("discriminator"), tokenC.getNode() );
- }
- public void testDiscriminatorScenario4() {
- ProcessDefinition pd = discriminatorProcessDefinition;
- Token root = Wfp06MultiChoiceTest.executeScenario(pd,4);
- Token tokenB = root.getChild("to b");
- Token tokenC = root.getChild("to c");
- tokenC.signal();
- assertSame( pd.getNode("d"), root.getNode() );
- assertSame( pd.getNode("b"), tokenB.getNode() );
- assertSame( pd.getNode("discriminator"), tokenC.getNode() );
- tokenB.signal();
- assertSame( pd.getNode("d"), root.getNode() );
- assertSame( pd.getNode("discriminator"), tokenB.getNode() );
- assertSame( pd.getNode("discriminator"), tokenC.getNode() );
- }
- public void testDiscriminatorScenario5() {
- ProcessDefinition pd = synchronizingdiscriminatorProcessDefinition;
- Token root = Wfp06MultiChoiceTest.executeScenario(pd,5);
- Token tokenB = root.getChild("to b");
- Token tokenC = root.getChild("to c");
- tokenB.signal();
- assertSame( pd.getNode("multichoice"), root.getNode() );
- assertSame( pd.getNode("discriminator"), tokenB.getNode() );
- assertSame( pd.getNode("c"), tokenC.getNode() );
- tokenC.signal();
- assertSame( pd.getNode("d"), root.getNode() );
- assertSame( pd.getNode("discriminator"), tokenB.getNode() );
- assertSame( pd.getNode("discriminator"), tokenC.getNode() );
- }
- public void testDiscriminatorScenario6() {
- ProcessDefinition pd = synchronizingdiscriminatorProcessDefinition;
- Token root = Wfp06MultiChoiceTest.executeScenario(pd,3);
- Token tokenB = root.getChild("to b");
- Token tokenC = root.getChild("to c");
- tokenC.signal();
- assertSame( pd.getNode("multichoice"), root.getNode() );
- assertSame( pd.getNode("b"), tokenB.getNode() );
- assertSame( pd.getNode("discriminator"), tokenC.getNode() );
- tokenB.signal();
- assertSame( pd.getNode("d"), root.getNode() );
- assertSame( pd.getNode("discriminator"), tokenB.getNode() );
- assertSame( pd.getNode("discriminator"), tokenC.getNode() );
- }
- }
流程定义文件
xml 代码
- <process-definition>
- <start-state name='start'>
- <transition to='a' />
- </start-state>
- <state name='a'>
- <transition to='multichoice' />
- </state>
- <fork name='multichoice'>
- <script>
- <variable name='transitionNames' access='write' />
- <expression>
- transitionNames = new ArrayList();
- if ( scenario == 1 ) {
- transitionNames.add( \"to b\" );
- } else if ( scenario == 2 ) {
- transitionNames.add( \"to c\" );
- } else if ( scenario >= 3 ) {
- transitionNames.add( \"to b\" );
- transitionNames.add( \"to c\" );
- }
- </expression>
- </script>
- <transition name='to b' to='b' />
- <transition name='to c' to='c' />
- </fork>
- <state name='b'>
- <transition to='discriminator' />
- </state>
- <state name='c'>
- <transition to='discriminator' />
- </state>
- <join name='discriminator'>
- <transition to='d' />
- </join>
- <state name='d' />
- </process-definition>
testDiscriminatorScenario1()
节点执行顺序
start --> a --> multichoice --> b --> discriminator --> d
testDiscriminatorScenario2()
节点执行顺序
start --> a --> multichoice --> c --> discriminator --> d
testDiscriminatorScenario3()
节点执行顺序
start --> a --> multichoice --> b --> discriminator --> d
multichoice --> c --> discriminator(废弃)
testDiscriminatorScenario4()
节点执行顺序
start --> a --> multichoice --> b --> discriminator(废弃) --> d
multichoice --> c --> discriminator
testDiscriminatorScenario5()
节点执行顺序
start --> a --> multichoice --> b --> discriminator --> d
multichoice --> c --> discriminator
testDiscriminatorScenario6()
节点执行顺序
start --> a --> multichoice --> b --> discriminator --> d
multichoice --> c --> discriminator
评论
4 楼
flyffa
2008-12-07
sorry,应该是更符合Structured Synchronizing Merge模式
3 楼
flyffa
2008-12-07
这个模式好像实现的有问题吧,按照workflow pattern的说法,应该是b,c两个分支无论谁先到discriminator,都直接往下走到d,而不是在这里等待吧。你这个做法更符合Multiple Merge模式。
2 楼
lovevirus
2006-12-18
假如你state是taskNode,那么是否要把taskNode中的taskInstance删掉,按平时的理解,如果废弃,那么看不到废弃那分支的任务了,比如请假流程,如果我请假取消,那么另外一个分支中的核实任务应该取消掉吧
1 楼
coolfish
2006-12-15
jbpm演示的不错,不过这个流程只执行在内存里.象第9个用到join的isDiscriminator属性,第10个模式用到的nOutOfM 属性都没有持久化,在实际场景中肯定用的麻烦了
发表评论
-
for download
2008-03-18 20:25 3http://www.softii.com/downinfo/ ... -
文档地址
2008-03-07 09:24 23http://wiki.redsaga.com/conflue ... -
jbpm 与工作流模式 多路聚合(Multiple Merge)
2006-11-27 14:06 2888多路聚合(Multiple Merge) Descripti ... -
jbpm与工作流模式 同步汇聚(Synchronizing Merge)
2006-11-24 18:56 2095同步汇聚(Synchronizing Me ... -
jbpm 使用日记10
2006-11-24 18:05 1424日期: 第五周. 第五天. 经过了近一个多月的努 ... -
jbpm 使用日记9
2006-11-21 16:24 2476日期: 第五周 第 ... -
jbpm 使用日记8
2006-11-20 15:59 1376jbpm 用户组织结构 日期: 第五周, 第一天 ... -
jbpm 与 工作流模式 多路选择(Multiple Choice)
2006-11-17 16:01 7881多路选择(Multiple Choice) Descript ... -
jbpm 与 工作流模式 基本控制模式(三)
2006-11-16 20:25 4261好像源代码功能有点问题. /* * JBoss, Home ... -
jbpm 与 工作流模式 基本控制模式(二)
2006-11-16 20:18 5551xml 代码 <process-defi ... -
jbpm 与 工作流模式 基本控制模式(一)
2006-11-16 16:17 10489工作流模式 本文以jdpl/jar/sr ... -
jbpm 使用日记7
2006-11-15 18:26 1129日期: 第四周 第二天 继续了一天理论知识学 ... -
jbpm 使用日记6 理论知识学习.
2006-11-13 10:54 1522日期: 第四周.第一天 经过jbpm 的一段时间研 ... -
jbpm 使用日记5 一个简单会签示例
2006-11-10 15:52 9997经过3周的努力,终于看到点收获的希望. 基本实现目前项目 ... -
jbpm 使用日记4
2006-11-09 17:49 1526用了整整一天的时间, 实现了个比较简单的会签的功能. ... -
jbpm 使用日记3
2006-11-08 12:01 5431又用了3天,终于对jbpm 集成有了一个比较明确的思路. ... -
jbpm 使用日记2
2006-11-02 14:39 1769改写 jbpm 自带的 应用 jsf 遇到很多问题和工作量. ... -
jbpm 使用日记1
2006-11-01 10:56 1987进度. 1.使用 jbpm 3.1.2 build jbpm. ...
相关推荐
jBPM4工作流应用开发指南 胡奇写的,十分赞!!
JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子。带有文档教程和所有源码+JAR包。在网上找了半天jbpm6\jbpm7的资料,都很少。所以 环境:Myeclipse2015 JDK1.7 mysql 5.0 Struts2+Spring3.1 1...
jBPM工作流详解,jBPM工作流详解 jBPM工作流详解,jBPM工作流详解 jBPM工作流详解,jBPM工作流详解
JBPM3.2工作流开发指南 JBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。同时它还能被部署在任何一款JAVA应用服务器上。
jbpm工作流引擎基于J2EE的轻量级,纯java,开源的工作流管理系统。
jbpm工作流教程,4.1版本的Java工作流
JBPM4工作流介绍.pptx
jBPM4工作流应用开发指南最新版_01 JBPM4详细指南,非常实用,我就是通过这个文档学习起来的,相当受益
工作流程 JBPM工作流管理工作流程 JBPM工作流管理工作流程 JBPM工作流管理工作流程 JBPM工作流管理
jBPM4工作流应用开发指南,很详细很全面,高清带书签的,适合新手入门
jBPM4工作流应用开发指南
jBPM4工作流应用开发指南完整版带书签
基于JBPM工作流的OA办公系统开发框架,完全支持二尺开发
jBPM4.4工作流开发指南(改进版) 开发环境搭建
JBPM4工作流应用开发指南.pdf
用OSWorkFlow和JBPM开发工作流异同点解析
jbpm开发指南 jbpm开发指南 jbpm 工作流 自定义
jbpm4工作流应用开发指南,很不错的一本书.也很清晰,希望大家喜欢
本示例是jBPM4工作流示例jbpmDemo,详细演示了jBPM4工作流引擎的使用,对工作流采用Canvas动画形象演示,非常实用。也非常先进和有趣。 希望您喜欢。
JBPM3.2.2源码,工作流引擎。JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。jBPM是公开源...