`
man1900
  • 浏览: 432837 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

jbpm4.4在线设计分支跳转

    博客分类:
  • JBPM
阅读更多

 

 我们知道jbpm4.4提供了三种比较方便的分支跳转方式,如下所示:

1.通过expression

 

<?xml version="1.0" encoding="UTF-8"?>

<process name="DecisionExpression" xmlns="http://jbpm.org/4.4/jpdl">

  <start g="16,102,48,48">
    <transition to="evaluate document"/>
  </start>

  <decision name="evaluate document" expr="#{content}" g="96,102,48,48">
    <transition name="good" to="submit document" g="120,60:-36,23" />
    <transition name="bad"  to="try again" g=":-15,-21" />
    <transition name="ugly" to="give up" g="120,189:-35,-41" />
  </decision>

  <state name="submit document" g="175,35,122,52" />
  <state name="try again" g="176,100,122,52" />
  <state name="give up" g="177,164,122,52" />

</process>
 

2.通过handler

<?xml version="1.0" encoding="UTF-8"?>

<process name="DecisionHandler" xmlns="http://jbpm.org/4.4/jpdl">

  <start g="16,102,48,48">
    <transition to="evaluate document" name=""/>
  </start>

  <decision name="evaluate document" g="96,102,48,48">
    <handler class="org.jbpm.examples.decision.handler.ContentEvaluation"/>
    <transition name="good" to="submit document" g="120,60:-37,22" />
    <transition name="bad" to="try again" g=":-19,-22" />
    <transition name="ugly" to="give up" g="120,189:-33,-39" />
  </decision>

  <state name="submit document" g="175,35,122,52" />
  <state name="try again" g="176,100,122,52" />
  <state name="give up" g="177,164,122,52" />

</process>
 

3.通过condition

<?xml version="1.0" encoding="UTF-8"?>

<process name="DecisionConditions" xmlns="http://jbpm.org/4.4/jpdl">

  <start g="16,102,48,48">
    <transition to="evaluate document" />
  </start>

  <decision name="evaluate document" g="96,102,48,48">
    <transition to="submit document" g="120,60:">
      <condition expr="#{content==&quot;good&quot;}" />
    </transition>
    <transition to="try again">
      <condition expr="#{content==&quot;bad&quot;}" />
    </transition>
    <transition to="give up" g="120,189:" />
  </decision>

  <state name="submit document" g="175,35,122,52"/>
  <state name="try again" g="176,100,122,52"/>
  <state name="give up" g="177,164,122,52"/>

</process>
 

我们发现这种方式,若一旦我们的流程定义完成后,再想在运行中动态改变这种分支条件的设计就很难了,但是我们知道可以在流程定义发布到后台后,我们可以提供动态修改xml的方式,用handler的方式加上我们的分支决定的decision(需要实现jpbm的decision接口即可),通过handler来实现分支有一个比较大的优点就是我们可以在handler动态去执行我们需要工作流额外执行的代码,并且可以通过这个判断来决定其跳转的路径。

 

但我们不可能为所有的有分支决定的流程都加一个decision handler,并且在里面进行动态的分支判断。那样的工作很大,并且不灵活。

 

我们看一下第二种handler的接口:

package org.jbpm.examples.decision.handler;

import org.jbpm.api.jpdl.DecisionHandler;
import org.jbpm.api.model.OpenExecution;

public class ContentEvaluation implements DecisionHandler {

  private static final long serialVersionUID = 1L;

  public String decide(OpenExecution execution) {
    String content = (String) execution.getVariable("content");
    if (content.equals("you're great")) {
      return "good";
    }
    if (content.equals("you gotta improve")) {
      return "bad";
    }
    return "ugly";
  }
}

 在这里我们可以看到,可以通过动态返回跳转路径则可。在上面我说过了,不能把这个返回值交给具体的decisionHandler来决定,这个决定应该由流程运行来动态决定,我们需要告诉这个handler,你需要按我的规则来运行计算,得到一个运行跳转的路径。于是我想到能不能用bsh有脚本来动态返回告诉这个handler如何执行。

 

以下我们以一个简单的订单流程来说明如何实现这个动态设计分支跳转。

 

首先我在线设计了一个流程,如下所示:

jbpm4在线流程设计

 

发布后,设计其分支条件,如下所示:

jbpm4分支条件设计

 

我们在条件那里加入流程干预:

String tranTo="金额小于2000元";
if(price*quantity>=2000){
       tranTo="金额大于等于2000";
}

 这个tranTo则是由我们系统的管理员来控制,大家发现其本身就是java代码来的,熟悉一些简单的java语法均可以。当然若我们在这里还可以做一些更复杂的操作,如执行调用第三方系统的接口等。

那么以上的price与quantity变量来自哪里呢?它们是流程表单里的字段,于是我们为这个流程动态绑定一个流程表单。

 

首先我们设计一个流程表单:

在线表单设计

 

其对应的字段映射为:

在线表单设计-表单字段

在后台绑定该表单:

绑定表单

启动流程:

绑定流程表单-启动

执行后,可以看到流程自动判断跳转:

 

我们看一下本身我们的handler如何写:

 

package com.htsoft.oa.workflow.handler;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.jpdl.DecisionHandler;
import org.jbpm.api.model.Activity;
import org.jbpm.api.model.OpenExecution;

import bsh.EvalError;
import bsh.Interpreter;

import com.htsoft.core.util.AppUtil;
import com.htsoft.oa.model.flow.ProHandleComp;
import com.htsoft.oa.service.flow.ProHandleCompService;
/**
 * 实现分支决定,可以在这里根据业务逻辑计算,决定分支的跳转
 * @author 
 *
 */
public class DecisionHandlerImpl implements DecisionHandler{
	
	private static final Log logger=LogFactory.getLog(DecisionHandlerImpl.class);
	
	@Override
	public String decide(OpenExecution execution) {
		logger.debug("enter decision handler....");
		
		ProcessEngine processEngine=(ProcessEngine)AppUtil.getBean("processEngine");
		
		ProHandleCompService proHandleCompService=(ProHandleCompService)AppUtil.getBean("proHandleCompService");
		
		String pdId=execution.getProcessDefinitionId();
		
		ProcessDefinition processDefinition= processEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionId(pdId).uniqueResult();
		
		String deployId=processDefinition.getDeploymentId();
		
		Activity curActivity=execution.getActivity();
		
		List<ProHandleComp> list=proHandleCompService.getByDeployIdActivityNameHandleType(deployId, curActivity.getName(), ProHandleComp.HANDLE_TYPE_HANDLER);
		
		if(list.size()>0){
			ProHandleComp proHandleComp=list.get(0);
			logger.info("exeCode:" + proHandleComp.getExeCode());
			//执行动态
			Interpreter it=new Interpreter();
				
			try {
				//取得所有流程变量,放于bsh环境,方便在bsh脚本环境中运行以方便决定流程跳转
				Map<String,Object> vars=(Map<String,Object>)execution.getVariables();
				Iterator<Entry<String, Object>> iterator= vars.entrySet().iterator();
				while(iterator.hasNext()){
					Entry<String, Object> entry=iterator.next();
					String key=entry.getKey();
					Object val=entry.getValue();
					it.set(key.replace(".", "_"), val);
				}
				logger.info("dynamic execution code tranTo:"+proHandleComp.getExeCode());
				it.eval(proHandleComp.getExeCode());
				String tran=(String)it.get("tranTo");
				logger.info("return tranTo:"+tran);
				return tran;
			} catch (EvalError e) {
				e.printStackTrace();
			}
		}
		
		return null;
	}
}
 

 

里面其实比较简单,就是通过动态执行那个给用户开放的代码片段,并且根据其tranTo变量的值来决定其如何跳转,在上面的例子就是流程表单中的金额是否大于2000元来跳转。

 

同样,我们知道jbpm4_lob中存着jbpm4的流程定义的xml文件,只要把动态修改jbpm4的流程定义,可以为我们的作何节点加上我们需要流程动态执行的事件及代码。请关注后续的文章,有介绍如何扩展jbpm4的流程事件。

 

 

在线看预览情况:

 

http://bbs.jee-soft.cn/swf/design_decision.html

 

http://bbs.jee-soft.cn/posts/list/285.page#384

在线测试地址:

网通:

http://oa.jee-soft.cn:8080/index.jsp

电信:

http://office.jee-soft.cn:8080/index.jsp

 

用户:admin,密码:1

  • 大小: 93.7 KB
  • 大小: 57.6 KB
  • 大小: 81.1 KB
  • 大小: 69.4 KB
  • 大小: 60.1 KB
  • 大小: 69.4 KB
  • 大小: 63.7 KB
分享到:
评论

相关推荐

    jBPM4.4.rar_jbpm4.4_jbpm4.4 PDF

    在《jBPM4.4开发指南》中,开发者可以了解到jBPM4.4的核心功能和设计原理。该指南通常涵盖以下几个关键知识点: 1. **系统架构**:jBPM4.4基于Eclipse Persistence API(JPA)和Hibernate ORM,提供了持久化服务,...

    jbpm4.4 在线设计流程图 ext + raphael

    本教程将深入探讨jbpm4.4的在线设计流程图特性,以及如何利用ext(一个JavaScript UI库)和raphael(一个矢量图形库)进行流程图的绘制与交互。 首先,jbpm4.4中的在线设计流程图功能依赖于ext库,它提供了丰富的...

    jbpm4.4下载地址

    3. **用户界面**:为了便于非技术背景的用户使用,jBPM 4.4提供了图形化的设计工具,允许用户通过拖放操作来构建复杂的业务流程,而无需编写任何代码。 4. **事件驱动架构**:jBPM 4.4采用了事件驱动的架构,这意味...

    jbpm4.4文档+学习资料

    1. 示例项目:通过分析jbpm4.4提供的示例项目,了解实际应用中的流程设计和实现。 2. 自定义服务:学习如何定义和实现自定义的服务任务,与外部系统交互。 3. 监控与报表:了解jbpm的监控工具和报表功能,用于分析...

    jBPM4.4开发实例

    通过这个入门实例,开发者可以学习到如何使用jBPM4.4进行流程设计、部署和执行的基本操作,并逐步掌握其在实际项目中的应用。在实践中不断探索和深入,才能更好地利用jBPM4.4实现业务流程自动化,提高工作效率。

    jbpm4.4中文开发指南

    **jbpm4.4中文开发指南** JBPM(Java Business Process Management)是一个开源的工作流管理系统,专注于业务流程的建模、执行和管理。jbpm4.4是该系统的某一版本,它提供了丰富的功能,包括流程定义、流程实例的...

    jBPM4.4开发指南

    ### jBPM4.4开发指南关键知识点解析 #### 一、工作流基础与概念 **1. 工作流定义** 工作流是指业务过程的部分或整体在计算机应用环境下的自动化,其目的是为了使在多个参与者之间按照某种预定义的规则传递文档、...

    jBPM 4.4用户手册 中文PDF

    **jBPM 4.4 用户手册 中文PDF** **jBPM 4.4** 是一个开源的工作流程管理系统,由Red Hat公司开发并维护,主要用于业务流程管理(BPM)和工作流自动化。该系统提供了强大的流程建模、执行和监控功能,支持Java平台,...

    JBPM4.4资料的其他补充

    在JBPM4.4版本中,开发者可以利用其提供的API和工具来设计、部署和执行复杂的业务流程。 首先,让我们深入了解一下JBPM4.4的核心特性: 1. **流程建模**:JBPM4.4支持BPMN(Business Process Modeling Notation)...

    jbpm4.4 schema.xsd

    jbpm4.4 schema.xsd jbpm4.4 schema.xsd jbpm4.4 schema.xsd jbpm4.4 schema.xsd jbpm4.4 schema.xsd

    jbpm4.4 shh2 项目示例

    - jbpm4.4是jbpm的第4代版本,提供了一套完整的流程管理解决方案,包括流程设计、执行、监控和优化。 - 它支持BPMN2.0标准,使得业务流程可以通过图形化的方式进行建模,非技术人员也能理解和修改。 - jbpm4.4...

    jBPM4.4 详解 API 中文

    ### jBPM4.4 API 详解:工作流自动化的核心技术 #### 一、工作流基础知识 工作流,作为业务过程的部分或整体自动化,旨在通过计算机应用环境实现文档、信息或任务在多个参与者间的自动传递,以达到预期的业务目标...

    JBPM4.4与SSH2之整合(附可运行源码和jar包列表)(my_jbpm4.4_ssh2.rar)

    JBPM4.4与SSH2之整合(附完整源码) 这些天,想着把jbpm4.4与ssh2整合一下,由于之前从来没用过jbpm,也不知道各版本之间会有什么差异(经过网上的收集对比,还真有些差异),整合起来,还真是有些步履艰难。收集了...

    jbpm4.4开发用户指南

    这份文档主要面向开发者,详细阐述了如何在项目中集成和使用jBPM 4.4进行流程设计和开发。它涵盖了以下关键知识点: 1. **环境配置**:介绍如何设置开发环境,包括JDK、Maven以及Eclipse等开发工具的安装和配置。 ...

    jBPM4.4.rar_jbpm4_jbpm4.4

    "jBPM4.4.docx" 文件可能是关于 jbPM 4.4 示例的详细文档,它可能包含如何安装、配置、创建和运行流程实例的步骤,以及可能遇到的问题和解决办法,对于学习和使用 jbPM 4.4 是非常有价值的参考资料。 总结,jbPM ...

    JBPM4.4流程管理Demo(附学习资料)

    JBPM4.4提供了一套强大的工具,包括流程设计工具(如Graclipse)、服务器端的流程引擎以及API,使得流程的生命周期管理变得简单。 3. **报销流程** - 报销流程通常涉及员工提交报销申请、财务部门审批、会计核算等...

    jbpm4.4+ssh

    【jbpm4.4+SSH】是一个集成的Java企业级应用框架,主要涉及的是工作流管理系统jbpm4.4与Spring、Struts2(SSH)三大框架的整合。jbpm4是一个开源的工作流程管理系统,它提供了流程定义、执行、监控和优化等一系列...

    jbpm4.4表字段说明

    JBPM4.4是JBoss Business Process Management (BPM)平台的一个特定版本,它提供了用于设计、执行和管理业务流程的工具和框架。在JBPM4.4中,数据库是存储流程实例、流程定义以及相关元数据的关键部分。以下是关于...

    jbpm4.4spring.rar_jbpm4_jbpm4.4

    【标题】"jbpm4.4spring.rar_jbpm4_jbpm4.4" 提供的是一个关于JBPM4.4与Spring框架整合的实际应用案例。JBPM(Java Business Process Management)是一款开源的工作流管理系统,它允许开发者设计、执行、管理和监控...

Global site tag (gtag.js) - Google Analytics