3.5. 客户动作(action)例子
声明:
本人E文VeryVeryPoor,又是刚刚开始学习JBPM工作流引擎,对原文及概念等理解不当的地方,请网友不吝赐教,吾将及时修改和更正。
本文仅是本人自己学习JBPM,对JBPM指南的学习理解过程。
还望可以对入门者有所帮助。共享之。
需要中英文对照Word文档者请联系:gutengcom@hotmail.com或留下邮件地址。
动作是绑定客户代码到jBPM业务中的一种机制。动作能和它自己的节点联合起
来(如果在业务的图形表示中他们是相关的)或动作能被编入到例子的事件中。
取得一个转换(transition),离开一个节点或进入一个节点。如果是那样的话,
动作不但是图形表示中的一部分,而且他们在执行触发了运行业务执行时的事件
时被执行。
我们以着眼于动作的实现开始,我们正在使用的例子:MyActionHandler.这个动
作处理执行不能做到真正的引人入胜的东西…它只是设置boolean变量
isExecuted 为true.这个变量isExecuted是static类型因此它可以被来自内部动作的处理访问也是动作验证它的值。
关于动作的更多信息可以在Section 7.4, “Actions”查找。
/*
MyActionHandler 代表了一个类,一个在jBPM业务执行期间能够执行一些用户
代码的类。
*/
public class MyActionHandler implements ActionHandler {
/*
在每个测试前(在设置里),isExecuted的成员将被设置为false.
*/
public static boolean isExecuted = false;
/*
这个动作将设置isExecuted为true,因此当动作被执行时,这单元测试将能够
被展示。
*/
public void execute(ExecutionContext executionContext) {
isExecuted = true;
}
}
As mentioned before, before each test, we'll set the static field MyActionHandler.isExecuted to false;
/*
每个测试都是由设置MyActionHandler的静态成员变量isExecuted为false
开始。
*/
public void setUp() {
MyActionHandler.isExecuted = false;
}
We'll start with an action on a transition.
public void testTransitionAction() {
/*
下面的过程是hello world业务的一个变量。我们从状态’s’到end-state
转换添加个动作。这个测试的目的是展示了整合java代码到jBPM业务中是如何容易。
*/
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"<process-definition>" +
" <start-state>" +
" <transition to='s' />" +
" </start-state>" +
" <state name='s'>" +
" <transition to='end'>" +
" <action class='org.jbpm.tutorial.action.MyActionHandler' />" +
" </transition>" +
" </state>" +
" <end-state name='end' />" +
"</process-definition>"
);
//让我们为过程定义启动一个新的执行。
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
/*
下面的signal将引起离开启动状态到进入状态‘s’的执行.
*/
processInstance.signal();
//这展现了MyActionHandler仍没被执行。
assertFalse(MyActionHandler.isExecuted);
/*
这个主要的执行路径被定位到状态’s’
*/
assertSame(processDefinition.getNode("s"),
processInstance.getRootToken().getNode());
/*
下面的signal将触发root token的执行。Token将取得动作的转换,在
调用signal的方法期间,动作将被执行。
*/
processInstance.signal();
/*
这里我们能看到在调用 signal方法期间MyActionHandler被执行。
*/
assertTrue(MyActionHandler.isExecuted);
}
下面的例子展示了同样的动作,但现在动作将被分别替换这个进入节点和离开
节点。注意和转换形成对比,事件只有一个,一个节点比一个事件类型更多。因
此动作替换了一个节点将被放入一个事件元素。
时间
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"<process-definition>" +
" <start-state>" +
" <transition to='s' />" +
" </start-state>" +
" <state name='s'>" +
" <event type='node-enter'>" +
" <action class='org.jbpm.tutorial.action.MyActionHandler' />" +
" </event>" +
" <event type='node-leave'>" +
" <action class='org.jbpm.tutorial.action.MyActionHandler' />" +
" </event>" +
" <transition to='end'/>" +
" </state>" +
" <end-state name='end' />" +
"</process-definition>"
);
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
assertFalse(MyActionHandler.isExecuted);
/*
下面的signal将引起离开启动状态到进入状态‘s’的执行.因此状态’s’
被输入,因此这个动作被执行。
*/
processInstance.signal();
assertTrue(MyActionHandler.isExecuted);
//我们重新设置MyActionHandler.isExecuted 为false
MyActionHandler.isExecuted = false;
/*
下面的signal将触发离开状态’s’的执行。因此动作将再次被执行。
*/
processInstance.signal();
// Voila.
assertTrue(MyActionHandler.isExecuted);
待续……