`

Java工作流引擎 JBoss jBPM 3.1.2 演示示例

 
阅读更多
jBPM是由JBoss开发的工作流和业务流程管理引擎,可以用于创建不同人、不同应用程序、不同服务之间交互的业务流程。jBPM还提供了一个可视化的业务流程设计器。jBPM包含下列组件:运行时引擎(一个POJO库),图形化设计器(一个Eclipse插件),基于Hibernate的持久化,基于JSF的web控制台,BPEL扩展等。

Hello World示例

流程定义是一个可管理的包含了节点和节点间交付件的流程图。Hello World示例流程包含三个节点。为了查看节点间如何相互配合,将不使用任何设计工具来定义一个简单的流程。下图显示了Hello World示例流程的流程图定义:



Hello World示例流程图

public void testHelloWorldProcess() {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
  "<process-definition>" +
  "  <start-state>" +
  "    <transition to='s' />" +
  "  </start-state>" +
  "  <state name='s'>" +
  "    <transition to='end' />" +
  "  </state>" +
  "  <end-state name='end' />" +
  "</process-definition>"
);
ProcessInstance processInstance = new ProcessInstance(processDefinition);
Token token = processInstance.getRootToken();
assertSame(processDefinition.getStartState(), token.getNode());
token.signal();
assertSame(processDefinition.getNode("s"), token.getNode());
token.signal();
assertSame(processDefinition.getNode("end"), token.getNode());
}


数据库示例

jBPM基本特性之一是能够在jBPM数据库中持久化执行过程中处于等待状态的流程。数据库示例将展示如何在jBPM数据库中存储一个流程实例。该示例可能涉及到jBPM上下文。为不同的用户代码创建Separate方法。举例来说,webapplication中的一段用户代码开始一个流程并在数据库中持久化。之后,一个消息驱动Bean(MDB)加载该流程实例继续执行流程。

public class HelloWorldDbTest extends TestCase {
  static JbpmConfiguration jbpmConfiguration = null;
  static {
    jbpmConfiguration = JbpmConfiguration.parseXmlString(
      "<jbpm-configuration>" +
      "  <jbpm-context>" +
      "    <service name='persistence' " +
      "             factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />" +
      "  </jbpm-context>" +
      "  <string name='resource.hibernate.cfg.xml' " +
      "          value='hibernate.cfg.xml' />" +
      "  <string name='resource.business.calendar' " +
      "          value='org/jbpm/calendar/jbpm.business.calendar.properties' />" +
      "  <string name='resource.default.modules' " +
      "          value='org/jbpm/graph/def/jbpm.default.modules.properties' />" +
      "  <string name='resource.converter' " +
      "          value='org/jbpm/db/hibernate/jbpm.converter.properties' />" +
      "  <string name='resource.action.types' " +
      "          value='org/jbpm/graph/action/action.types.xml' />" +
      "  <string name='resource.node.types' " +
      "          value='org/jbpm/graph/node/node.types.xml' />" +
      "  <string name='resource.varmapping' " +
      "          value='org/jbpm/context/exe/jbpm.varmapping.xml' />" +
      "</jbpm-configuration>"
    );
  } 
  public void setUp() {
    jbpmConfiguration.createSchema();
  } 
  public void tearDown() {
    jbpmConfiguration.dropSchema();
  }
  public void testSimplePersistence() {
    deployProcessDefinition();
    processInstanceIsCreatedWhenUserSubmitsWebappForm();
    theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();
  }
  public void deployProcessDefinition() {
    ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
      "<process-definition name='hello world'>" +
      "  <start-state name='start'>" +
      "    <transition to='s' />" +
      "  </start-state>" +
      "  <state name='s'>" +
      "    <transition to='end' />" +
      "  </state>" +
      "  <end-state name='end' />" +
      "</process-definition>"
    );
    JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
    try {
      jbpmContext.deployProcessDefinition(processDefinition);

    } finally {
      jbpmContext.close();
    }
  }
  public void processInstanceIsCreatedWhenUserSubmitsWebappForm() {
    JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
    try {
      GraphSession graphSession = jbpmContext.getGraphSession();     
      ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("hello world");
      ProcessInstance processInstance = new ProcessInstance(processDefinition);
      Token token = processInstance.getRootToken();
      assertEquals("start", token.getNode().getName());
      token.signal();
      assertEquals("s", token.getNode().getName());
      jbpmContext.save(processInstance);
    } finally {
      jbpmContext.close();
    }
  }
  public void theProcessInstanceContinuesWhenAnAsyncMessageIsReceived() {
    JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
    try {
      GraphSession graphSession = jbpmContext.getGraphSession();
      ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("hello world");
      List processInstances = graphSession.findProcessInstances(processDefinition.getId());
      ProcessInstance processInstance = (ProcessInstance) processInstances.get(0);
      processInstance.signal();
      assertTrue(processInstance.hasEnded());
      jbpmContext.save(processInstance);
    } finally {
      jbpmContext.close();
    }
  }
}




上下文示例:流程变量

流程变量包含了流程执行期间的上下文信息。流程变量类似一个java.util.Map类型的名称/值对,并且是java对象。流程变量是流程实例的组成部分。以免事件复杂化,该示例仅仅演示处理流程变量的API,没有包括持久化处理。


ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
  "<process-definition>" +
  "  <start-state>" +
  "    <transition to='s' />" +
  "  </start-state>" +
  "  <state name='s'>" +
  "    <transition to='end' />" +
  "  </state>" +
  "  <end-state name='end' />" +
  "</process-definition>"
);

ProcessInstance processInstance = new ProcessInstance(processDefinition);
ContextInstance contextInstance = processInstance.getContextInstance();
contextInstance.setVariable("amount", new Integer(500));
contextInstance.setVariable("reason", "i met my deadline");
processInstance.signal();
assertEquals(new Integer(500), contextInstance.getVariable("amount"));
assertEquals("i met my deadline", contextInstance.getVariable("reason"));



任务分配示例

任务分配示例演示如何给用户分配任务。因为分离jBPM工作流引擎和组织模型,处理参与者的表现语言始终受到很多限制。因此,你必须实现一个包含处理任务参与者的任务分配器。

public void testTaskAssignment() {
  ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
    "<process-definition name='the baby process'>" +
    "  <start-state>" +
    "    <transition name='baby cries' to='t' />" +
    "  </start-state>" +
    "  <task-node name='t'>" +
    "    <task name='change nappy'>" +
    "      <assignment class='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler' />" +
    "    </task>" +
    "    <transition to='end' />" +
    "  </task-node>" +
    "  <end-state name='end' />" +
    "</process-definition>"
  );
  ProcessInstance processInstance =
      new ProcessInstance(processDefinition);
  Token token = processInstance.getRootToken();
  token.signal();
  assertSame(processDefinition.getNode("t"), token.getNode());
  TaskInstance taskInstance = (TaskInstance)processInstance
        .getTaskMgmtInstance()
        .getTaskInstances()
        .iterator().next();
  assertEquals("papa", taskInstance.getActorId() );
  taskInstance.end();
  assertSame(processDefinition.getNode("end"), token.getNode());
}

分享到:
评论

相关推荐

    jbpm教程(工作流引擎)

    下载`jbpm-starters-kit-3.1.2`版本,此版本包含JBPM流程设计器的Eclipse插件及基于JBOSS的应用示例。解压缩后,使用Eclipse导入其中的JBPM工程文件。 #### 流程定义与XML JBPM使用XML进行流程定义,这是大多数...

    jbpm-starters-kit-3.1.2.zip官方下载地址

    jbpm-starters-kit-3.1.2.zip官方...版本里包括一个JBPM流程设计器的Eclipse插件,和一个用JBOSS作为服务器的示例流程等相关文件。解压jbpm-starters-kit-3.1.2.rar到某个特定目录,这里我们首先用到的是包里的JBPM目

    jbpm的一个实例

    JBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。同时它还能被部署在任何一款JAVA应用服务器上 JBPM的工程文件,大家可以到...

    Jbpm开发流程实例演示.ppt

    【Jbpm开发流程实例演示】的PPT主要讲解了如何使用Jbpm进行工作流开发,以下是基于这个主题的详细知识点: 1. **jBPM概述** jBPM是一个开源的工作流平台,它提供了面向图形的编程方式来定义流程,让开发者能够专注...

    jbpm 下载链接资源

    在深入探讨JBPM及其下载资源之前,我们先来了解一下JBPM的基本概念以及它在工作流管理领域的地位。JBPM(JBoss Business Process Management)是Red Hat公司开发的一款开源业务流程管理(BPM)框架,主要应用于Java...

    jbpm-jpdl-suite-3.2.3的安装配置

    jBPM,全称为Java Business Process Management,是一个开源的工作流管理系统,主要应用于J2EE环境中。自2004年10月18日成为JBoss企业中间件平台的一部分以来,jBPM一直在不断发展,其核心特性是使用了JBoss jBPM ...

    JBPM工作流

    推荐下载`jbpm-starters-kit-3.1.2`这一版本,因为它包含了JBPM流程设计器的Eclipse插件以及基于JBOSS的应用示例。下载并解压缩文件后,可以在其中找到名为`JBPM`的Eclipse项目文件夹。通过Eclipse导入该项目,即可...

    jbmp用户指南.pdf

    jBPM是JBoss组织提供的一款灵活且可扩展的工作流管理系统,它拥有直观的流程设计语言,支持图形化表示业务流程,并具备强大的流程控制机制。 在开始使用jBPM之前,你需要搭建相应的开发环境。以下是搭建环境的步骤...

    JBPM开发指南WORD文档

    建议下载`jbpm-starters-kit-3.1.2`这一版本,其中包含了Eclipse插件的JBPM流程设计器以及基于JBOSS服务器的示例流程等文件。解压缩后,可以将JBPM目录下的工程文件导入Eclipse中进行开发。 ##### 2.2 HelloWorld...

    JBPM框架设计简介

    jBPM,全称JBoss Business Process Management,是一个全面的开源框架,专门用于处理业务流程管理、工作流以及服务协作。这个框架以其灵活性和可扩展性著称,允许开发者创建可执行的流程定义,以支持企业的业务流程...

    一个Jbpm员工请假流程的实例

    说明,这篇文章说使用的流程实例是,学习《一个JBPM工作流管理示例》文章中的流程而来。原文中的流程实例不是jbpm3.1版本,不能适用于jbpm3.1。本人将其改写,并加入自己的设计和实现。原文地址为...

    jbpm帮助非常有用喔一直用这个

    jbpm是一个强大的业务流程管理(BPM)和工作流引擎,它被广泛应用于协调人员、应用程序和服务之间的业务过程。在本文中,我们将深入探讨为什么选择jbpm,它所提供的功能,以及如何利用它来构建和管理流程。 首先,...

    JBPM 开发指南

    **JBPM** 是一个完全由 Java 语言编写的开源工作流管理系统,以其强大的可扩展性和灵活性而著称。JBPM 的持久化层采用了 Hibernate 技术,这使得它能够支持 Hibernate 所支持的几乎所有类型的数据库。此外,JBPM ...

    JBPM-员工请假流程实例

    此实例包括的是一个员工请假审批的流程实例,和流程相关的代码以及相应的测试代码。此流程在Eclipse3.1.2 ,JBoss-IDE 1.6环境...说明,这篇文章说使用的流程实例是,学习《一个JBPM工作流管理示例》文章中的流程而来。

Global site tag (gtag.js) - Google Analytics