好文档 - 专业文书写作范文服务资料分享网站

深入浅出 jBPM 电子书 

天下 分享 时间: 加入收藏 我要投稿 点赞

下一个例子我们将向你展示怎样分配一个任务到用户。因为jBPM工作流引擎与组织模型是独立的,所以任何一种用来计算参与者的表达式语言都是有限制的,因此,你不得不指定一个AssignmentHandler实现,用来包含任务参与者的计算。

public void testTaskAssignment() {

// 下面的流程基于hello world 流程。状态节点被一个task-node节点 // 所替换。task-node JPDL中的一类节点,它表示一个等待状态并且产生

// 将要完成的任务,这些任务在流程继续之前被执行。 ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(

\\ + \ \ +

\ \ + \ \ +

\ \ +

\ \ + \

class='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler' />\ +

\ \ +

\ \ + \ \ +

\ \ + \\ );

// 创建一个流程定义的执行。

ProcessInstance processInstance =

new ProcessInstance(processDefinition);

Token token = processInstance.getRootToken();

// 让我们起动流程执行,通过默认转换离开开始状态 token.signal();

// signal方法将会把流程阻塞在一个等待状态, // 在这里,就是阻塞在task-node。

assertSame(processDefinition.getNode(\

// 当执行到达task-node,一个'change nappy'任务被创建,并且 // NappyAssignmentHandler 被调用,来决定任务将要分配给谁。 // NappyAssignmentHandler 返回'papa'。

// 在一个实际环境中,将使用org.jbpm.db.TaskMgmtSession中的方法 // 从数据库获取任务。因为我们不想在这个例子中包含复杂的持久化, // 所以我们仅使用这个流程实例的第一个任务实例(我们知道,在这个

// 测试情景,只有一个任务)。

TaskInstance taskInstance = (TaskInstance) processInstance

.getTaskMgmtInstance() .getTaskInstances() .iterator().next();

// 现在我们检查taskInstance 是否真正的分配给了'papa'。 assertEquals(\

// 现在我们假设'papa'已经完成了他的职责,并且标示任务为已完成。 taskInstance.end();

// 因为这是要做的最后一个任务(也是唯一一个),所以任务的完成 // 会触发流程实例的继续执行。

assertSame(processDefinition.getNode(\ }

3.5 定制动作示例

动作是一种绑定你自己的定制代码到jBPM流程的机制。动作可以与它自己的节点(如果它们与流程的图形化表示是相关的)相关联。动作也可以被放置在事件上,如执行转换、离开节点或者进入节点;如果那样的话,动作则不是图形化表示的一部分,但是在流程执行运行时,当执行触发事件时,它们会被执行。

我们先看一下将要在我们的例子中使用的动作实现:MyActionHandler,这个动作处理实现实际上没有做任何事…仅仅是设置布尔变量isExecuted为true。变量isExecuted是一个静态变量,因此它可以在动作处理的内部访问(即内部方法中),也可以从动作(即在动作类上)验证它的值。

有关动作的更多信息可以在“9.5 动作”中找到。

// MyActionHandler 是一个在jBPM流程执行期间可以执行用户代码的类。

public class MyActionHandler implements ActionHandler {

// 在每个测试之前(在 setUp方法中), isExecuted 成员被设置为false。

public static boolean isExecuted = false;

// 动作将设置isExecuted为true,当动作被执行之后,单元测试会 // 展示。

public void execute(ExecutionContext executionContext) { isExecuted = true; } }

就象前面所提示那样,在每个测试之前,我们将设置静态域MyActionHandler.isExecuted为false。

// 每个测试都将以设置MyActionHandler的静态成员isExecuted // 为false开始。 public void setUp() {

MyActionHandler.isExecuted = false; }

我们将会在转换上开始一个动作。

public void testTransitionAction() {

// 下面的流程与hello world 流程不同。我们在从状态“s”到 // 结束状态的转换上增加了一个动作。这个测试的目的就是展示 // 集成java代码到一个jBPM流程是多么的容易。 ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( \\ \ \

\ \ \ \

\ \

\ \ \

class='org.jbpm.tutorial.action.MyActionHandler' />\ \ \ \ \

\ \ \\ );

// 让我们为流程定义起动一个新的执行。 ProcessInstance processInstance =

new ProcessInstance(processDefinition);

// 下面的信号会导致执行离开开始状态,进入状态“s”。 processInstance.signal();

// 这里我们展示MyActionHandler还没有被执行。 assertFalse(MyActionHandler.isExecuted); // ... 并且执行的主路径被定位在状态“s”。

assertSame(processDefinition.getNode(\

processInstance.getRootToken().getNode());

// 下面的信号将触发根令牌的执行,令牌将会执行带有动作的转换, // 并且在调用signal方法期间动作经会被执行token。 processInstance.signal();

// 我们可以看到MyActionHandler在调用signal方法期间被执行了。 assertTrue(MyActionHandler.isExecuted); }

下一个例子展示了相同的动作,但是现在动作分别被放置在了enter-node和leave-node事件上。注意,节点与转换相比有更多的事件类型,而转换只有一个,因此动作要放置在节点上应该放入一个event元素中。

ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( \ \

\\ \

\

\ \ \

class='org.jbpm.tutorial.action.MyActionHandler' />\ \ \

\ \ \

class='org.jbpm.tutorial.action.MyActionHandler' />\ \ \

\\ \

\ \ );

ProcessInstance processInstance =

new ProcessInstance(processDefinition);

assertFalse(MyActionHandler.isExecuted);

//下面的信号会导致执行离开开始状态,进入状态“s”, // 因此状态 's' 被进入,动作被执行。 processInstance.signal();

assertTrue(MyActionHandler.isExecuted);

// 我们重新设置MyActionHandler.isExecuted。 MyActionHandler.isExecuted = false;

// 下一个信号将会触发执行离开状态's',因此动作将被执行。 processInstance.signal(); // 请看

assertTrue(MyActionHandler.isExecuted);

第5章 部署 jBPM是一个嵌入式BPM引擎,这意味着你可以象安装一个独立的软件产品并集成一样把jBPM嵌入到你自己的java工程中,可以这样做的一个主要方面就是最小化的依赖,本章讨论jbpm库及其依赖。 5.1 Java运行环境 jBPM3要求J2SE1.4.2+ 5.2 jBPM库 jbpm-[version].jar是核心功能库。 jbpm-identity-[version].jar是包含在“11.11 身份组件”中描述的身份组件的库(可选的)。 5.3 第三方库 在一个最小化的部署中,你仅仅通过放置commons-logging和dom4j库到你的classpath,就可以使用jBPM创建和运行流程,但是这样不支持流程的持久化。如果你不使用流程的xml解析,可以移除dom4j库,改为编程创建对象图。 表格 5.1 库 用途 描述 目录 jBPM代码日志记录lib/jboss(从commons-logging.jar 在jBPM和hibernate中到commons jboss4.0.3) 记录日至。 logging,commons logging库可以被配置为分发日志到java1.4日志、log4j、…等等,有关怎样配置commons logging的更多信息请看apache commons 用户指南。如果你使用log4j,最简单的方式就是把log4j库和一个log4j.properties放置到classpath,commons logging将会自动检测并使用该配置。 流程定义和Xml解析。 Dom4j-1.6.1.jar lib/dom4j hibernate持久化。

深入浅出 jBPM 电子书 

下一个例子我们将向你展示怎样分配一个任务到用户。因为jBPM工作流引擎与组织模型是独立的,所以任何一种用来计算参与者的表达式语言都是有限制的,因此,你不得不指定一个AssignmentHandler实现,用来包含任务参与者的计算。publicvoidtestTaskAssignment(){//下面的流程基于helloworld流程。状态节点被一
推荐度:
点击下载文档文档为doc格式
8l9bb1yjqg01k8300sny
领取福利

微信扫码领取福利

微信扫码分享