任务指派实例
作者:sunking
在下面的例子里,我们将向您展示如何能给用户分配任务。因为在jBPM工作流
引擎和组织机构模型之间是分离的,对计算参与者的表达语言将总是被限制的。
因此,你必须指定一个任务处理的实现,包括计算任务参与者。
public void testTaskAssignment() {
/*
这个下面展示的业务是基于hello world业务之上。
这个状态节点将被任务节点取代。这个任务节点是一个在JPDL中的节点,它表现为一个等待状态和在业务能继续被执行之前,生成的任务被完成。
*/
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"<process-definition name='the baby process'>" +
" <start-state>" +
" <transition name='baby cries' to='t' />" +
" </start-state>" +
" <task-node name='t'>" +
" <task name='change nappy'>" +
" <assignment class='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler' />" +
" </task>" +
" <transition to='end' />" +
" </task-node>" +
" <end-state name='end' />" +
"</process-definition>"
);
//创建一个业务定义的执行。
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
Token token = processInstance.getRootToken();
/*
我们启动业务执行,离开在它缺省转换的启动状态上。
*/
token.signal();
/*
这个signal方法将阻止它继续,直到业务执行进入一个等待状态。在这个情况下,这是个任务节点。
*/
assertSame(processDefinition.getNode("t"), token.getNode());
/*
当执行到达任务节点,一个任务 ‘change nappy’被创建和
NappyAssignmentHandler被调用确定任务被分配给谁。
NappyAssignmentHandler将返回’papa’.
*/
/*
在真实的环境里,这个任务被在org.jbpm.db.TaskMgmtSession
里面的方法从数据库中取出。当我们不想包括例子里的持久化复杂性时,我
们将取得第一个业务实例的任务例子。(在测试情节中我们只有一个实例)
*/
TaskInstance taskInstance = (TaskInstance)
processInstance
.getTaskMgmtInstance()
.getTaskInstances()
.iterator().next();
//现在我们检查是否taskInstance确实被分配给’papa’.
assertEquals("papa", taskInstance.getActorId() );
//现在我们猜想’papa’已经完成了职责,标记这个任务完成了。
taskInstance.end();
//当这些是最后要作的任务时,完成的任务触发器将延续这个业务实例的执行。
assertSame(processDefinition.getNode("end"), token.getNode());
}