jbpm的流程定义从发布上看有2种方式,一种是发布持久化到关系型数据库中,另一种则是由java代码实时生成。
之前一直关注持久化的方式,每次都是生成好固定的xml文件,然后发布到数据中,然后再从数据库中检索出来使用。
不过通过2天的学习,第二种代码生成的方式有着第一种持久化方式所不能替代的优点。下面通过一个简单但是非常实用的例子来说明。
网上有很多人在问,fork分出去的多条路线,为什么一定要全部到达join后才能延续流程,能不能其中部分路线到达后流程就继续呢。很多人通过了很复杂的方法实现了这个功能。下面我就介绍一个简单的办法,在fork下增加script元素:
- package com.jeffentest;
- import org.jbpm.*;
- import org.jbpm.graph.def.ProcessDefinition;
- import org.jbpm.graph.exe.*;
- import org.jbpm.context.exe.ContextInstance;
-
-
- public class Jeffentest {
- static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
- static ProcessDefinition processDefinition = null;
- static ProcessInstance processInstance = null;
- //static SchedulerSession schedulerSession =null;
- private static void run(){
- //JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try {
- 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='syncmerge' />" +
- " state>" +
- " <state name='c'>" +
- " <transition to='syncmerge' />" +
- " state>" +
- " <join name='syncmerge'>" +
- " <transition to='end' />" +
- " join>" +
- " <end-state name='end'>end-state>" +
- "process-definition>"
- );
- processInstance= new ProcessInstance(processDefinition);
- ContextInstance ci = (ContextInstance) processInstance.getInstance( ContextInstance.class );
- Token root = processInstance.getRootToken();
- System.out.println(root.getNode());//StartState(start)
- root.signal();
- System.out.println(root.getNode());//State(a)
- ci.setVariable( "scenario", new Integer(2) );
- root.signal();
- Token tokenB = root.getChild("to b");
- Token tokenC = root.getChild("to c");
- System.out.println(root.getNode());//Fork(multichoice)
- System.out.println("tokenC:"+tokenC.getNode());//tokenC:State(c)
- tokenC.signal();
- System.out.println("tokenC:"+tokenC.getNode());//tokenC:Join(syncmerge)
- System.out.println(root.getNode());//EndState(end)
-
- }catch(Exception e){
- e.printStackTrace();
- }finally {
- //jbpmContext.close();
- }
- }
- public static void main(String[] args) {
- run();
- }
- }
运行结果如下:
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 );
分享到:
相关推荐
JBPM插件允许用户通过图形化界面来设计流程图,这些流程图可以转化为可执行的流程定义,方便理解和管理复杂的业务逻辑。 在提供的压缩包"eclipse3.4解压版带jbpm流程定义插件"中,用户无需安装,仅需解压即可开始...
了解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...
jbpm流程定义是jbpm流程开发的核心,旨在定义jbpm流程的逻辑和行为。流程定义包括process-definition、node、start-state、end-state、state、task-node、fork等多个组件。 process-definition(流程定义) ...
此外,还介绍了如何定义jBPM用户库,以及如何在目录中添加jPDL4模式,并导入示例。 在流程的部署与服务方面,文档说明了如何部署业务归档、流程文件和流程资源,以及如何部署Java类。它还介绍了jBPM的几个关键服务...
JBPM使用三张核心表来记录流程定义、实例和任务实例的信息:`JBPM_PROCESSDEFINITION`、`JBPM_PROCESSINSTANCE` 和 `JBPM_TASKINSTANCE`。 1. **获取所有已发布流程的最新版本** 通过`JbpmContext`对象可以访问到...
总结,jBPM提供了全面的业务流程管理解决方案,包括强大的流程定义语言、灵活的业务日历和直观的流程建模工具。掌握这些知识,可以帮助企业在业务自动化和流程优化方面取得显著进步。如果你是初次接触jBPM,建议从...
5. **规则集成**:JBPM集成了Drools规则引擎,使得业务流程可以灵活地根据预定义的规则进行决策。这使得流程的执行不仅依赖于固定逻辑,还能动态响应业务环境的变化。 6. **监控与调试**:JBPM提供了强大的监控工具...
jbpm(Java Business Process Management)是一个开源的企业级工作流管理系统,它允许开发者通过定义业务流程来自动化企业的业务操作。jbpm流程设计器作为jbpm框架的重要组成部分,提供了一个直观的图形化界面,使得...
**jbpm 请假流程定义发布项目** jbpm(Java Business Process Management)是一个开源的工作流管理系统,主要用于业务流程的建模、执行和管理。这个项目主要介绍如何使用jbpm来实现一个具体的请假流程,并且提供了...
1. **流程建模**:jbpm支持BPMN 2.0标准,这是一种通用的业务流程建模语言,允许开发者通过图形化的方式定义业务流程。用户可以通过Eclipse插件或其他支持BPMN的工具创建流程图,包括开始事件、结束事件、任务、网关...
4. **spring.xml**:Spring框架的配置文件,它可能包含了对JBPM服务(如流程定义仓库、任务服务、执行服务等)的bean定义,以及依赖注入设置。Spring是常见的用来管理和集成JBPM的框架,它可以简化组件的装配和依赖...
【MyEclipse6.0下Jbpm流程设计器】是一个专为MyEclipse6.0集成的业务流程管理(Business Process Management,BPM)工具,主要用于设计和管理Jbpm流程。Jbpm是一个开源的工作流和业务流程管理平台,它提供了一套完整...
JBPM(Java Business Process Management)是由JBOSS公司开发的一款开源的工作流管理系统,它提供了全面的业务流程自动化和管理解决方案。作为一个强大的BPM平台,JBPM不仅支持工作流的建模、部署、执行,还提供了...
1. 过程定义(Process Definition)和流程实例(Process Instance):jbpm流程引擎内核中最基本的对象和服务。 2. 调度机制和执行机制:jbpm流程引擎内核中用于解决流程运行问题的机制。 3. 微内核流程引擎构架:...
"JBPM工作流实战_流程定义文件的上传处理视频 03"这一主题主要关注如何在实际操作中处理JBPM流程定义文件的上传,这在构建业务流程自动化系统时是非常关键的步骤。 首先,流程定义文件是JBPM工作流的核心组成部分,...
- **流程定义与部署**:使用BPMN 2.0进行流程设计,并将流程模型部署到JBPM服务器。 - **流程执行**:启动流程实例,根据流程定义执行任务。 - **任务管理**:分配、领取、完成任务,支持任务查询和过滤。 - **...
本笔记主要涉及如何创建JBPM所需数据库,定义流程,以及发布流程。 1. **创建JBPM数据库** - JBPM提供了针对不同数据库的SQL脚本,例如在`D:\jbpm-starters-kit-3.1.4\jbpm-db\build`目录下,可以找到针对Oracle的...
jbpm流程引擎框架源码,一套流行的流程引擎框架代码
- 进入节点设置页面,定义流程中各个节点的逻辑。节点表达式用于控制流程路径和会签规则。例如,"出纳审核"节点的路径可能取决于特定条件,如只有当某个参数满足特定值时,流程才会流向"公司经理审核"。 5. **变量...