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

重新看待jbpm的流程定义

阅读更多

jbpm的流程定义从发布上看有2种方式,一种是发布持久化到关系型数据库中,另一种则是由java代码实时生成。

之前一直关注持久化的方式,每次都是生成好固定的xml文件,然后发布到数据中,然后再从数据库中检索出来使用。

不过通过2天的学习,第二种代码生成的方式有着第一种持久化方式所不能替代的优点。下面通过一个简单但是非常实用的例子来说明。

网上有很多人在问,fork分出去的多条路线,为什么一定要全部到达join后才能延续流程,能不能其中部分路线到达后流程就继续呢。很多人通过了很复杂的方法实现了这个功能。下面我就介绍一个简单的办法,在fork下增加script元素:

  1. package com.jeffentest;   
  2. import org.jbpm.*;   
  3. import org.jbpm.graph.def.ProcessDefinition;   
  4. import org.jbpm.graph.exe.*;   
  5. import org.jbpm.context.exe.ContextInstance;   
  6.   
  7.   
  8. public class Jeffentest {   
  9.     static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();   
  10.     static ProcessDefinition processDefinition = null;   
  11.     static ProcessInstance processInstance = null;   
  12.     //static SchedulerSession schedulerSession =null;   
  13.     private static void run(){   
  14.         //JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();   
  15.         try {   
  16.             processDefinitionProcessDefinition.parseXmlString(   
  17.                       "<process-definition>" +   
  18.                       "  <start-state name='start'>" +   
  19.                       "    <transition to='a' />" +   
  20.                       "  start-state>" +   
  21.                       "  <state name='a'>" +   
  22.                       "    <transition to='multichoice' />" +   
  23.                       "  state>" +   
  24.                       "  <fork name='multichoice'>" +   
  25.                       "    <script>" +   
  26.                       "      <variable name='transitionNames' access='write' />" +   
  27.                       "      <expression>" +   
  28.                       "        transitionNames = new ArrayList();" +   
  29.                       "        if ( scenario == 1 ) {" +   
  30.                       "          transitionNames.add( \"to b\" );" +   
  31.                       "        } else if ( scenario == 2 ) {" +   
  32.                       "          transitionNames.add( \"to c\" );" +   
  33.                       "        } else if ( scenario >= 3 ) {" +   
  34.                       "          transitionNames.add( \"to b\" );" +   
  35.                       "          transitionNames.add( \"to c\" );" +   
  36.                       "        }" +   
  37.                       "      expression>" +   
  38.                       "    script>" +   
  39.                       "    <transition name='to b' to='b' />" +   
  40.                       "    <transition name='to c' to='c' />" +   
  41.                       "  fork>" +   
  42.                       "  <state name='b'>" +   
  43.                       "    <transition to='syncmerge' />" +   
  44.                       "  state>" +   
  45.                       "  <state name='c'>" +   
  46.                       "    <transition to='syncmerge' />" +   
  47.                       "  state>" +   
  48.                       "  <join name='syncmerge'>" +   
  49.                       "    <transition to='end' />" +   
  50.                       "  join>" +   
  51.                       "  <end-state name='end'>end-state>" +   
  52.                       "process-definition>"   
  53.                     );   
  54.             processInstancenew ProcessInstance(processDefinition);   
  55.             ContextInstance ci = (ContextInstance) processInstance.getInstance( ContextInstance.class );   
  56.             Token root = processInstance.getRootToken();   
  57.             System.out.println(root.getNode());//StartState(start)   
  58.             root.signal();   
  59.             System.out.println(root.getNode());//State(a)   
  60.             ci.setVariable( "scenario", new Integer(2) );   
  61.             root.signal();   
  62.             Token tokenB = root.getChild("to b");    
  63.             Token tokenC = root.getChild("to c");   
  64.             System.out.println(root.getNode());//Fork(multichoice)   
  65.             System.out.println("tokenC:"+tokenC.getNode());//tokenC:State(c)   
  66.             tokenC.signal();   
  67.             System.out.println("tokenC:"+tokenC.getNode());//tokenC:Join(syncmerge)   
  68.             System.out.println(root.getNode());//EndState(end)   
  69.                
  70.         }catch(Exception e){   
  71.             e.printStackTrace();   
  72.         }finally {   
  73.               //jbpmContext.close();   
  74.         }   
  75.     }      
  76.     public static void main(String[] args) {   
  77.         run();   
  78.     }   
  79. }   

运行结果如下:

StartState(start)
State(a)
Fork(multichoice)
tokenC:State(c)
tokenC:Join(syncmerge)
EndState(end)

大家看到了,fork出去2条路线b/c,c完成了而b没有完成,但是整个流程已经结束了。

这里有一点需要注意,这种方式仅仅适合代码生成流程定义,如果你想通过持久化流程定义到数据库的方式,那么结果就仍然要等待路线b的完成了。为什么呢?因为这是jbpm3.1.2的限制:the script in a fork is not persisted.  script in fork might be removed in later versions of jPDL.

有兴趣的朋友可以验证一下。

还有一个节点类型Merge也是同样的情况,它有一个Synchronized属性。对于这个节点jbpm的开发者有这么一段话,大家见仁见智吧。
/**
 * TODO is the merge node usefull ?
 * i don't think the merge node is usefull because every node has an
 * implicit merge in front of it (= multiple transitions can arrive in
 * the same node).  maybe we should just leave this in for the sake
 * of workflow patterns ?
 */
附:merge的使用语句
Merge merge = (Merge) processDefinition.getNode("xor");
merge.setSynchronized( false );

 

分享到:
评论
4 楼 LeanderSaka 2007-03-15  
最近正好在做JBPM的东西,由java代码实时生成的是真的没有试过,感谢LG了。
3 楼 jevy30 2007-03-09  
写join即可实现,如下:
<join name="join" >
      <event type="node-enter">
         <script>org.jbpm.graph.node.Join join = (org.jbpm.graph.node.Join)node;join.setDiscriminator(true);</script>
      </event>
    <transition to="end" />
  </join> 
2 楼 skllb 2007-01-15  
标题正是我正在研究的, 呵、内容有点不符、
1 楼 jeffen2006 2006-12-01  
java代码中的xml不能正确显示,csdn就可以。

相关推荐

    eclipse3.4解压版带jbpm流程定义插件

    JBPM插件允许用户通过图形化界面来设计流程图,这些流程图可以转化为可执行的流程定义,方便理解和管理复杂的业务逻辑。 在提供的压缩包"eclipse3.4解压版带jbpm流程定义插件"中,用户无需安装,仅需解压即可开始...

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

    了解jbpm流程引擎内核的设计思想和结构,需要具备一定的工作流基本概念,例如流程系统结构、流程定义和流程实例等。同时,需要具备一定的开发环境,例如Eclipse开发环境和jbpm-starters-kit开发包。 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_流程_能让你熟练的掌握

    jbpm流程定义是jbpm流程开发的核心,旨在定义jbpm流程的逻辑和行为。流程定义包括process-definition、node、start-state、end-state、state、task-node、fork等多个组件。 process-definition(流程定义) ...

    JBPM流程引擎资料

    此外,还介绍了如何定义jBPM用户库,以及如何在目录中添加jPDL4模式,并导入示例。 在流程的部署与服务方面,文档说明了如何部署业务归档、流程文件和流程资源,以及如何部署Java类。它还介绍了jBPM的几个关键服务...

    JBPM流程监控的实现过程

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

    jbmp入门教程,jBPM流程定义语言,业务日历,流程建模

    总结,jBPM提供了全面的业务流程管理解决方案,包括强大的流程定义语言、灵活的业务日历和直观的流程建模工具。掌握这些知识,可以帮助企业在业务自动化和流程优化方面取得显著进步。如果你是初次接触jBPM,建议从...

    JBPM流程引擎设计 工作流资料

    5. **规则集成**:JBPM集成了Drools规则引擎,使得业务流程可以灵活地根据预定义的规则进行决策。这使得流程的执行不仅依赖于固定逻辑,还能动态响应业务环境的变化。 6. **监控与调试**:JBPM提供了强大的监控工具...

    jbpm流程设计器

    jbpm(Java Business Process Management)是一个开源的企业级工作流管理系统,它允许开发者通过定义业务流程来自动化企业的业务操作。jbpm流程设计器作为jbpm框架的重要组成部分,提供了一个直观的图形化界面,使得...

    jbpm 请假流程定义发布项目

    **jbpm 请假流程定义发布项目** jbpm(Java Business Process Management)是一个开源的工作流管理系统,主要用于业务流程的建模、执行和管理。这个项目主要介绍如何使用jbpm来实现一个具体的请假流程,并且提供了...

    揭秘jbpm流程引擎内核.pdf

    1. **流程建模**:jbpm支持BPMN 2.0标准,这是一种通用的业务流程建模语言,允许开发者通过图形化的方式定义业务流程。用户可以通过Eclipse插件或其他支持BPMN的工具创建流程图,包括开始事件、结束事件、任务、网关...

    JBPM流程代码演示

    4. **spring.xml**:Spring框架的配置文件,它可能包含了对JBPM服务(如流程定义仓库、任务服务、执行服务等)的bean定义,以及依赖注入设置。Spring是常见的用来管理和集成JBPM的框架,它可以简化组件的装配和依赖...

    MyEclipse6.0下Jbpm流程设计器

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

    JBPM 流程 监控 的实现

    JBPM(Java Business Process Management)是由JBOSS公司开发的一款开源的工作流管理系统,它提供了全面的业务流程自动化和管理解决方案。作为一个强大的BPM平台,JBPM不仅支持工作流的建模、部署、执行,还提供了...

    JBPM工作流实战_流程定义文件的上传处理视频 03

    "JBPM工作流实战_流程定义文件的上传处理视频 03"这一主题主要关注如何在实际操作中处理JBPM流程定义文件的上传,这在构建业务流程自动化系统时是非常关键的步骤。 首先,流程定义文件是JBPM工作流的核心组成部分,...

    JBPM流程框架源码

    - **流程定义与部署**:使用BPMN 2.0进行流程设计,并将流程模型部署到JBPM服务器。 - **流程执行**:启动流程实例,根据流程定义执行任务。 - **任务管理**:分配、领取、完成任务,支持任务查询和过滤。 - **...

    jbpm流程引擎框架源码

    jbpm流程引擎框架源码,一套流行的流程引擎框架代码

    jbpm流程部署文件

    - 进入节点设置页面,定义流程中各个节点的逻辑。节点表达式用于控制流程路径和会签规则。例如,"出纳审核"节点的路径可能取决于特定条件,如只有当某个参数满足特定值时,流程才会流向"公司经理审核"。 5. **变量...

    jbpm流程图状态显示

    1. 设计并部署流程定义:使用jbpm提供的工具(如jbpm-designer)创建流程图,然后将流程部署到jbpm引擎。 2. 启动流程实例:根据部署的流程定义,启动一个实例,并分配初始的参与者或任务。 3. 实时更新状态:当流程...

Global site tag (gtag.js) - Google Analytics