BPM流程管理BPM实例开发培训课件Word文件下载.docx
《BPM流程管理BPM实例开发培训课件Word文件下载.docx》由会员分享,可在线阅读,更多相关《BPM流程管理BPM实例开发培训课件Word文件下载.docx(100页珍藏版)》请在冰豆网上搜索。
“JUnitTest”运行它们。
jBPM包含一个用来创作例子中展示的XML的图形化设计器工具,你可以在“2.1下载概述”中找到这个工具的下载说明,但是完成本指南不需要图形化设计器工具。
1.1HelloWorld示例
一个流程定义就是一个有向图,它由节点和转换组成。
Helloworld流程有三个节点,下面来看一下它们是怎样组装在一起的,我们以一个简单的流程作为开始,不用使用设计器工具,下图展示了helloworld流程的图形化表示:
图3.1helloworld流程图
publicvoidtestHelloWorldProcess(){
//这个方法展示了一个流程定义以及流程定义的执行。
//这个流程定义有3个节点:
一个没有命名的开始状态,
//一个状态“s”,和一个名称为“end”的结束状态。
//下面这行是解析一段xml文本到ProcessDefinition对象(流程定义)。
//ProcessDefinition把一个流程的规格化描述表现为java对象。
ProcessDefinitionprocessDefinition=ProcessDefinition.parseXmlString(
"
<
process-definition>
"
+
start-state>
<
transitionto='
s'
/>
/start-state>
statename='
>
end'
/state>
end-statename='
/process-definition>
);
//下面这行是创建一个流程定义的执行。
创建后,流程执行有一个
//主执行路径(=根令牌),它定位在开始状态。
ProcessInstanceprocessInstance=
newProcessInstance(processDefinition);
//创建后,流程执行有一个主执行路径(=根令牌)。
Tokentoken=processInstance.getRootToken();
//创建后,主执行路径被定位在流程定义的开始状态。
assertSame(processDefinition.getStartState(),token.getNode());
//让我们开始流程执行,通过它的默认转换离开开始状态。
token.signal();
//signal方法将会把流程阻塞在一个等待状态。
//流程执行进入第一个等待状态“s”,因此主执行路径现在定位
//在状态“s”。
assertSame(processDefinition.getNode("
s"
),token.getNode());
//让我们发送另外一个信号,这将通过使用状态“s”的默认转换
//离开状态“s”,恢复流程执行。
//现在signal方法将返回,因为流程示例已经到达结束状态。
end"
}
1.2数据库示例
jBPM的特性之一就是在流程等待状态时,拥有把流程的执行持久化到数据库中的能力。
下面的例子将向你展示怎样存储一个流程实例到数据库,例子中还会出现上下文。
分开的方法被用来创建不同的用户代码,例如,一段代码在web应用中启动一个流程并且持久化执行到数据库,稍后,由一个消息驱动bean从数据库中加载流程实例并且恢复它的执行。
有关jBPM持久化的更多信息可以在“第7章持久化”找到。
publicclassHelloWorldDbTestextendsTestCase{
staticJbpmConfigurationjbpmConfiguration=null;
static{
//在“src/config.files”可以找到象下面这样的一个示例配置文件。
//典型情况下,配置信息在资源文件“jbpm.cfg.xml”中,但是在这里
//我们通过XML字符串传入配置信息。
//首先我们创建一个静态的JbpmConfiguration。
一个JbpmConfiguration
//可以被系统中所有线程所使用,这也是为什么我们可以把它安全的设置
//为静态的原因。
jbpmConfiguration=JbpmConfiguration.parseXmlString(
jbpm-configuration>
//jbpm-context机制分离了jbpm核心引擎和来自于外部环境的服务。
jbpm-context>
servicename='
persistence'
factory='
org.jbpm.persistence.db.DbPersistenceServiceFactory'
+
/jbpm-context>
//同样,jbpm使用的所有资源文件在jbpm.cfg.xml中被提供。
stringname='
resource.hibernate.cfg.xml'
value='
hibernate.cfg.xml'
resource.business.calendar'
org/jbpm/calendar/jbpm.business.calendar.properties'
resource.default.modules'
org/jbpm/graph/def/jbpm.default.modules.properties'
resource.converter'
org/jbpm/db/hibernate/jbpm.converter.properties'
resource.action.types'
org/jbpm/graph/action/action.types.xml'
resource.node.types'
org/jbpm/graph/node/node.types.xml'
resource.varmapping'
org/jbpm/context/exe/jbpm.varmapping.xml'
/jbpm-configuration>
);
publicvoidsetUp(){
jbpmConfiguration.createSchema();
publicvoidtearDown(){
jbpmConfiguration.dropSchema();
publicvoidtestSimplePersistence(){
//在下面调用的3个方法之间,所有的数据通过数据库被传递。
//在这个测试中,这3个方法被依次执行,因为我们想要测试一个
//完整的流程情景。
但是实际上,这些方法表示了对服务器的不同
//请求。
//因为我们以一个干净的空数据库开始,所以我们首先必须部署流程。
//事实上,这只需要由流程开发者做一次。
deployProcessDefinition();
//假设在一个web应用中当用户提交一个表单时我们起动一个流程
//实例(=流程执行)…
processInstanceIsCreatedWhenUserSubmitsWebappForm();
//然后,一个异步消息到达时继续执行。
theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();
publicvoiddeployProcessDefinition(){
//这个测试展示了一个流程定义以及流程定义的执行。
ProcessDefinitionprocessDefinition=ProcessDefinition.parseXmlString(
process-definitionname='
helloworld'
start-statename='
start'