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

声明:

本人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();
     
     
  }
     
     
}
     
     

 

待续….

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值