\factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />\
\
// 同样,jbpm使用的所有资源文件在jbpm.cfg.xml中被提供。
\ \value='hibernate.cfg.xml' />\
\
\value='org/jbpm/calendar/jbpm.business.calendar.properties' />\
\
\value='org/jbpm/graph/def/jbpm.default.modules.properties' />\
\
\value='org/jbpm/db/hibernate/jbpm.converter.properties' />\
\
\value='org/jbpm/graph/action/action.types.xml' />\ \
\value='org/jbpm/graph/node/node.types.xml' />\ \
\value='org/jbpm/context/exe/jbpm.varmapping.xml' />\
\ ); }
public void setUp() {
jbpmConfiguration.createSchema(); }
public void tearDown() {
jbpmConfiguration.dropSchema(); }
public void testSimplePersistence() {
// 在下面调用的3个方法之间,所有的数据通过数据库被传递。 // 在这个测试中,这3个方法被依次执行,因为我们想要测试一个 // 完整的流程情景。但是实际上,这些方法表示了对服务器的不同 // 请求。
// 因为我们以一个干净的空数据库开始,所以我们首先必须部署流程。 // 事实上,这只需要由流程开发者做一次。 deployProcessDefinition();
// 假设在一个web应用中当用户提交一个表单时我们起动一个流程 // 实例(=流程执行)…
processInstanceIsCreatedWhenUserSubmitsWebappForm();
// 然后,一个异步消息到达时继续执行。
theProcessInstanceContinuesWhenAnAsyncMessageIsReceived(); }
public void deployProcessDefinition() {
// 这个测试展示了一个流程定义以及流程定义的执行。 // 这个流程定义有3个节点:一个没有命名的开始状态, // 一个状态“s”,和一个名称为“end”的结束状态。 ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
\ \ \
\
\
\ \ );
// 查找在上面所配置的pojo持久化上下文创建器。 JbpmContext jbpmContext =
jbpmConfiguration.createJbpmContext(); try {
// 部署流程定义到数据库中。
jbpmContext.deployProcessDefinition(processDefinition);
} finally {
// 关闭pojo持久化上下文。这包含激发(flush)SQL语句把流程 // 定义插入到数据库。 jbpmContext.close(); } }
public void
processInstanceIsCreatedWhenUserSubmitsWebappForm() {
// 本方法中的代码可以被放在struts的actiong中,或JSF管理 //的bean中。
//查找在上面所配置的pojo持久化上下文创建器。 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(\ // 让我们起动流程执行 token.signal();
// 现在流程在状态 's'。
assertEquals(\
// 现在流程实例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(\
// 现在我们搜索这个流程定义的所有流程实例。 List processInstances =
graphSession.findProcessInstances(processDefinition.getId());
// 因为我们知道在这个单元测试中只有一个执行。 // 在实际情况中, 可以从所到达的信息内容中提取processInstanceId
// 或者由用户来做选择。
ProcessInstance processInstance =
(ProcessInstance) processInstances.get(0);
// 现在我们可以继续执行。注意:processInstance 将委托信号 // 到主执行路径(=根令牌)。 processInstance.signal();
// 在这个信号之后,我们知道流程执行应该到达了结束状态。 assertTrue(processInstance.hasEnded());
// 现在我们可以更新数据库中的执行状态。 jbpmContext.save(processInstance);
} finally {
// 关闭pojo持久化上下文。 jbpmContext.close(); } } }
3.3 上下文示例:流程变量
流程变量包含了流程执行期间的上下文信息,流程变量与一个java.util.Map相似,它影射变量名称和值,值是java对象,流程变量作为流程实例的一部分被持久化。为了让事情简单,在这里的例子中我们只是展示使用变量的API,而没有持久化。
有关变量的更多信息可以在“第10章 上下文”中找到。
// 这个例子仍然从hello world流程开始,甚至没有修改。 ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( \ \
\
\
\
\ \ );
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
// 从流程实例获取上下文实例,用来使用流程变量。 ContextInstance contextInstance =
processInstance.getContextInstance();
// 在流程离开开始状态之前,我们要在流程实例的上下文中 // 设置一些流程变量。
contextInstance.setVariable(\ contextInstance.setVariable(\
// 从现在开始,这些流程变量与流程实例相关联。现在展示由用户代码通过 // API访问流程变量,另外,这些代码也可以存在于动作或节点的实现中。 // 流程变量被作为流程实例的一部分也被存储到数据库中。 processInstance.signal();
// 通过contextInstance访问流程变量。
assertEquals(new Integer(500),
contextInstance.getVariable(\ assertEquals(\
contextInstance.getVariable(\
3.4 任务分配示例