JBPM 工作流引擎 JBPM指南 例子:数据库 (3.2)
来源:互联网 发布:宁波花溢网络科技集团 编辑:程序博客网 时间:2024/04/20 17:09
声明:
本人E文VeryVeryPoor,又是刚刚开始学习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();
}
}
待续….
- JBPM 工作流引擎 JBPM指南 例子:数据库 (3.2)
- JBPM 工作流引擎 JBPM指南 例子:任务指派实例(3.4)
- JBPM 工作流引擎 JBPM指南 jbpm 指南第一章翻译
- JBPM 工作流引擎 JBPM指南 例子:客户动作(action)例子(3.5)
- JBPM 工作流引擎 JBPM指南 例子:Hello World 流程定义(3.1)
- JBPM 工作流引擎 JBPM指南 例子:上下文环境-业务变量(3.3)
- JBPM工作流引擎测试的一个例子
- JBPM工作流引擎理论基础
- jbpm 工作流引擎
- 工作流引擎JBPM使用
- 工作流引擎 jBPM
- jbpm工作流引擎
- JBPM-工作流引擎
- 浅析JBPM工作流引擎
- 浅析JBPM工作流引擎
- JBPM-工作流引擎
- JBPM工作流引擎
- 浅析JBPM工作流引擎
- 天使在等我……
- 读取oracle表结构和字段的注释
- 买酱油与软件工程阶段划分
- 【转贴】笑死你的整人电话终极篇!
- DELPHI多国语言版本编写指南
- JBPM 工作流引擎 JBPM指南 例子:数据库 (3.2)
- [废话]准备迎接RiA时代。。。
- 愤怒了!!除夕夜前,我要回家!!!
- Hibernate用Mysql数据库时链接关闭异常的解决
- XQuery performance问题
- middlegenide的生成文件中文注释小问题修改
- 回家了
- 偶发现csdn blog的管理端的速度实在使太忙了,经常等待,
- openoffice的目录标签建立方法