⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 helloworlddbtest.java

📁 对jbpm工作流进行简单的实现与操作
💻 JAVA
字号:
package com.sample;

import java.util.List;   

import junit.framework.TestCase;   
  
import org.jbpm.JbpmConfiguration;   
import org.jbpm.JbpmContext;   
import org.jbpm.db.GraphSession;   
import org.jbpm.graph.def.ProcessDefinition;   
import org.jbpm.graph.exe.ProcessInstance;   
import org.jbpm.graph.exe.Token;   
  
public class HelloWorldDbTest extends TestCase {   
  
  static JbpmConfiguration jbpmConfiguration = null;   
  
  
  static {   
         
    // 实例配置文件,例如此文件能够在  src/config.files 文件夹下找到。   
    // 正常的情况下此配置文件的信息是在 jbpm.cfg.xml 资源文件中,   
    // 但这里我们放配置文件信息作为一个XML字符串   
         
    // 首先我们创建 JbpmConfiguration 静态变量。   
    // 一个 JbpmConfiguration 能够用于系统中的所有线程,那就是我们让它是static类型的原因。   
  
    jbpmConfiguration = JbpmConfiguration.parseXmlString(   
      "<jbpm-configuration>" +   
         
      // jbpm-context 上下文机制把jBPM核心引擎和jbpm使用的服务从环境中分开   
         
      "  <jbpm-context>" +   
      "    <service name='persistence' " +   
      "             factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />" +    
      "  </jbpm-context>" +   
         
      // 而且 jbpm 所使用的资源文件都参考 jbpm.cfg.xml 文件   
         
      "  <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() {   
       
    // 下面这3个方法调用中,所有数据都是通过数据库传递的。   
    // 在这个单元测试里,因为我们想要测试一个完整的流程环境,所以这3个方法在交互后被执行。   
    // 但实际上,这些方法代表了对服务器的不同的请求。   
         
    // 因为我们开始的是一个干净的、空的内存数据库,所以我们不得不先部署流程。   
    // 实际上,这个以前是由流程开发人员来完成的。   
    deployProcessDefinition();   
  
    // 假设我们想开始一个流程实例(=流程执行)当用户在web应用中提交一个表单时...   
    processInstanceIsCreatedWhenUserSubmitsWebappForm();   
  
    // 然后,异步消息到来流程继续执行   
    theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();   
  }   
  
  public void deployProcessDefinition() {   
    // 这个测试显示流程定义和一个流程定义的执行。流程有三个节点:   
    // 未命名的开始状态、状态's'和一个命名为'end'的结束状态   
    ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(   
      "<process-definition name='hello world'>" +   
      "  <start-state>" +   
      "    <transition to='s' />" +   
      "  </start-state>" +   
      "  <state name='s'>" +   
      "    <transition to='end' />" +   
      "  </state>" +   
      "  <end-state name='end' />" +   
      "</process-definition>"  
    );   
  
    // 查找上面配置的pojo持久性上下文生成器   
    JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();   
    try {   
      // 在数据库中部署流程定义    
      jbpmContext.deployProcessDefinition(processDefinition);   
  
    } finally {   
      // 拆毁 pojo 持久性上下文。   
      // 这里包含刷新SQL并插入流程定义到数据库中     
      jbpmContext.close();   
    }   
  }   
  
  public void processInstanceIsCreatedWhenUserSubmitsWebappForm() {   
    // 在方法里的代码能够放在struts-ation或JSF管理bean中。   
    // 查找上面配置的pojo持久性上下文生成器   
       
    JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();   
    try {   
  
      GraphSession graphSession = jbpmContext.getGraphSession();   
         
      ProcessDefinition processDefinition =    
          graphSession.findLatestProcessDefinition("hello world");   
       
      // 用从数据库中检索到的processDefinition,   
      // 我们能创建一个像在hello world例子中那样的流程定义执行(那个例子是持久性的)   
      ProcessInstance processInstance =    
          new ProcessInstance(processDefinition);   
         
      Token token = processInstance.getRootToken();    
      assertEquals("start", token.getNode().getName());   
      // 让我们开始流程执行   
      token.signal();   
      // 现在流程是在状态's'。   
      assertEquals("s", token.getNode().getName());   
         
      // 现在 processInstance 被存储在数据库中。所以流程执行的当前状态被存储在数据库中。   
      jbpmContext.save(processInstance);   
      // 下面的方法将从数据库中取出流程实例,并通过提供的另一个外部信号恢复执行   
  
    } finally {   
      // 拆毁pojo持久性上下文。   
      jbpmContext.close();   
    }   
  }   
  
  public void theProcessInstanceContinuesWhenAnAsyncMessageIsReceived() {   
    // 方法里的代码能够成为消息驱动Bean的内容.   
    // 查找上面配置的pojo持久性上下文生成器   
         
    JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();   
    try {   
  
      GraphSession graphSession = jbpmContext.getGraphSession();   
      // 首先,我们必须得到数据库中取出的流程实例.有几个选项是我们要知道的   
      // 什么样的流程实例我们正在处理的.在这个简单测试用例是最容易的,因为只是查找流程实例的所有列表.   
      // 那样就只给我们一个结果.所以让我们查看流程定义.   
         
      ProcessDefinition processDefinition =    
          graphSession.findLatestProcessDefinition("hello world");   
  
      // 我们搜索流程定义的所有流程实例   
      List processInstances =    
          graphSession.findProcessInstances(processDefinition.getId());   
         
      // 因为我们知道这个单元测试的上下文里,只有一个执行。在实际的环境中,processInstanceId   
      // 能够从到达的消息内容或从用户做的选择中进行提取。   
      ProcessInstance processInstance =    
          (ProcessInstance) processInstances.get(0);   
         
      // 现在我们继续执行,注意那个 processInstance 代理信号到达执行主路径(=root token)。   
      processInstance.signal();   
  
      // 在这个信号后,我们知道流程执行应该已到了结束状态   
      assertTrue(processInstance.hasEnded());   
         
      // 现在我们可以更新数据库中的执行状态   
      jbpmContext.save(processInstance);   
  
    } finally {   
      // 拆毁pojo持久性上下文。   
      jbpmContext.close();   
    }   
  }   
}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -