JBPM 工作流引擎 JBPM指南 例子:数据库 (3.2)

来源:互联网 发布:宁波花溢网络科技集团 编辑:程序博客网 时间:2024/04/20 17:09

声明:

本人EVeryVeryPoor,又是刚刚开始学习JBPM工作流引擎,对原文及概念等理解不当的地方,请网友不吝赐教,吾将及时修改和更正。

本文仅是本人自己学习JBPM,对JBPM指南的学习理解过程。

还望可以对入门者有所帮助。共享之。

需要中英文对照Word文档者请联系:gutengcom@hotmail.com或留下邮件地址。

3.2. 例子:数据库

jBPM的基本特征之一是当业务处理处在一个等待的状态时,支持业务的数据库持久化执行能力。下面的例子将为你展示如何将业务实例存储进jBPM数据库中。这个例子也提出了可能产生哪些上下文环境。几段不同的用户代码是单独被创建的方法。例子:在webapplication中每段用户代码启动一个业务和数据库持久化的执行。然后,一个消息驱动bean(message driven bean)从数据库装载业务实例并重新启动执行。

More about the jBPM persistence can be found in Chapter 6, Persistence.

更多关于jBPM持久化可以在jBPM的文档Chapter 6, Persistence中了解.

public class HelloWorldDbTest extends TestCase {
 
 
/*
我们需要申请一个JbpmSessionFactory,因此我们把它放到一个静态变量中
static variable),这个JbpmSessionFactory将被使用在创建的test方法中(test methods)
*/
  static JbpmSessionFactory jbpmSessionFactory = 
      JbpmSessionFactory.buildJbpmSessionFactory();
  
  static {
  
/*
the hypersonic in-memory database以来是一个新的数据库,在我们
启动测试前,我们需要创建运行时的计划,下面一行创建了一个数据库
表和外键约束关系。
*/
    jbpmSessionFactory.getJbpmSchema().createSchema();
  }
  public void testSimplePersistence() {
   
/*
在下面的3个方法调用之间,所有数据是通过数据库传递。这里,在单元
测试中,因为我们想测试一个完成的业务情节,这3个方法彼此被正确的
执行。但事实上,这些方法代表了对服务器的不同请求。
 
当我们启动一个干净的,空的内存数据库时,我们首先部署业务。事实上,
这些被业务开发人员做过一次了。
*/
    deployProcessDefinition();
/*
推想我们想要启动一个业务实例,
process instance (=process execution)
当用户在一个web application 中提交一个form……
*/
    processInstanceIsCreatedWhenUserSubmitsWebappForm();
/*
然后,一个异步消息到达时,将会继续执行。
*/
    theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();
  }
  public void deployProcessDefinition() {
    
/*
这个测试展示了一个业务定义和业务定义的执行。业务定义有3个节点:
an unnamed start-state, a state 's' and an end-state named 'end'.
*/
    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>
    );
    
//我们打开一个新的持久化session
    JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
//然后开始一个在持久session上的事务。
    jbpmSession.beginTransaction();
    
//把业务定义保存到数据库里
    jbpmSession
        .getGraphSession()
        .saveProcessDefinition(processDefinition);
    //提交事务
    jbpmSession.commitTransaction();
//关闭session.
    jbpmSession.close();
  }
  public void processInstanceIsCreatedWhenUserSubmitsWebappForm() {
   
/*
在这个方法中的代码可以被放到struts-action 
     or a JSF managed bean.
    */
//我们打开一个新的持久化session
    JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
//然后开始一个在持久session上的事务。
    jbpmSession.beginTransaction();
    
/*
现在对我们在上面部署的业务定义进行数据库查询。
*/
    ProcessDefinition processDefinition = 
        jbpmSession
          .getGraphSession()
          .findLatestProcessDefinition("hello world");
    
/*
随着我们从数据库提取的业务定义,我们能创建一个业务定义的执行,
就像hello world example(它没有持久化)
*/
    ProcessInstance processInstance = 
        new ProcessInstance(processDefinition);
    
    Token token = processInstance.getRootToken(); 
    assertEquals("start", token.getNode().getName());
//启动业务执行
    token.signal();
//现在业务处在状态’s’中 。
    assertEquals("s", token.getNode().getName());
    
/*
现在这业务实例被保存到数据库里。因此当前业务执行的状态被存储到
数据库里。
*/
    jbpmSession
        .getGraphSession()
        .saveProcessInstance(processInstance);
  
/*
下面的方法将得到从数据库收回的业务实例,然后通过在另外的扩展信号
条件下,重新启动执行。
*/
//webapp action的结尾,事务被提交。
    jbpmSession.commitTransaction();
//关闭事务。
    jbpmSession.close();
  }
  public void theProcessInstanceContinuesWhenAnAsyncMessageIsReceived() {
//在方法中的这段代码是在消息驱动中的内容。
//我们打开一个新的持久化session
    JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
    
/*
 然后在持久化session上开始事务,注意,它也可能使用
在你的应用服务器上的a jdbc connection 
*/
 
    jbpmSession.beginTransaction();
    GraphSession graphSession = jbpmSession.getGraphSession();
 
/*
首先,我们需要得到从数据库收回的业务实例。要知道我们在这处理的
业务实例有几个选项。在这个简单的测试案例中正在寻找这个完整
的业务实例列表。那将给我们唯一的结果。因此我们可以查询业务定义。
*/
    ProcessDefinition processDefinition = 
        graphSession.findLatestProcessDefinition("hello world");
 
现在,我们搜索所有业务定义的业务实例。
    List processInstances = 
        graphSession.findProcessInstances(processDefinition.getId());
    
我们知道在单元测试内容中只有一个业务执行。在实际生命周期中,业
务实例能够从到达的消息内容中或来自用户的选择中提取。
    ProcessInstance processInstance = 
        (ProcessInstance) processInstances.get(0);
    
/*
现在我们能继续执行。注意,业务实例代表了signals执行的主要(path)
执行路线(path)或叫(轨迹)(=the root token)
*/
    processInstance.signal();
 
/*
在这个signal,我们知道业务执行将到达end-state.
*/
    assertTrue(processInstance.hasEnded());
    
//现在我们能更新在数据库中的执行状态。
    graphSession.saveProcessInstance(processInstance);
 
//MDB的结尾,事务被提交.
    jbpmSession.commitTransaction();
//关闭事务jbpmSession.
    jbpmSession.close();
  }
}

 

待续….

原创粉丝点击