http://77857.blog.51cto.com/67857/171334
http://tech.ddvip.com/2009-09/1252499380131731_3.html jbpm
http://www.pcjx.net/Java/J2eeh/216094.html 实现并发流程
一、任务分派 (单个任务,多个用户,把一个任务分派给一个用户)
package org.jbpm.tutorial.taskmgmt;
import junit.framework.TestCase;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
import org.jbpm.taskmgmt.exe.TaskInstance;
public class TaskAssignmentTest extends TestCase {
public void testTaskAssignment() {
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();
assertSame(processDefinition.getNode("t"), token.getNode());
// When execution arrived in the task-node, a task 'change nappy'
// was created and the NappyAssignmentHandler was called to determine
// to whom the task should be assigned. The NappyAssignmentHandler
// returned 'papa'.
// In a real environment, the tasks would be fetched from the
// database with the methods in the org.jbpm.db.TaskMgmtSession.
// Since we don't want to include the persistence complexity in
// this example, we just take the first task-instance of this
// process instance (we know there is only one in this test
// scenario.
TaskInstance taskInstance = (TaskInstance)
processInstance
.getTaskMgmtInstance()
.getTaskInstances()
.iterator().next();
// Now, we check if the taskInstance was actually assigned to 'papa'.
assertEquals("papa", taskInstance.getActorId() );
taskInstance.end();
// Since this was the last (only) task to do, the completion of this
// task triggered the continuation of the process instance execution.
assertSame(processDefinition.getNode("end"), token.getNode());
}
}
import org.jbpm.graph.exe.*;
import org.jbpm.taskmgmt.def.*;
import org.jbpm.taskmgmt.exe.Assignable;
public class NappyAssignmentHandler implements AssignmentHandler {
private static final long serialVersionUID = 1L;
public void assign(Assignable assignable, ExecutionContext executionContext) {
assignable.setActorId("papa");
}
}
------------------------------------------------------------------------------------------------------------
<task name="撤回请假单" swimlane="applyman" template="apply_3_new.ftl"><controller><variable name="reason" access="read" mapped-name="reason"><task-node name="审核"><task template="apply_2.ftl" swimlane="boss" name="审核员工请假"><controller><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><task template="apply_3_new.ftl" swimlane="applyman" name="撤回请假单"><controller><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day">
这个节点包含了我们刚才说的两个任务.我们知道当流传到这个节点的时候.这两个任务会同时创建并分配给各自的人员.有一个人完成任务后 节点向指定的节点转向.同时结束另一个任务. signal="first" 有一个任务结束节点就流转. end-tasks="true" 结束该节点的时候自动结束其他没有完成的任务.
1、node(自动节点)
这种节点和State相反,也称自动节点。当业务程序实例执行到这个节点不会停止执行。而是会继续往下执行。如果该节点存在多个离开转向。那么,就会执行其中的第一个离开转向,在Node状态中,不需要外部参与者的参与,业务流程的这个部分是自动的、即时完成的。
TaskInstances 和 SwimlaneInstance s 两者都可以分配给指定的用户或参与者池. 分配一个TaskInstance给用户, 调用 Assignable.setActorId(String actorId) . 分配一个TaskInstance给候选参与者池, 调用 Assignable.setPooledActors(String[] actorIds).
流程中的每个任务都可以用在运行时间执行分配handler的实现关联起来.
当流程中多个任务被分配给同一个人或一组参与者,考虑 swimlane用途
----------------------------------------------------------------------------------------------在tasknode中,多个transition
public void approveByManager(boolean pass){
System.out.println("==FirstFlowProcessTest.approveByManager()==");
ProcessInstance pi=this.getContext().getProcessInstance(4);
Iterator<TaskInstance> it = pi.getTaskMgmtInstance().getTaskInstances().iterator();
for( ;it.hasNext(); ){
TaskInstance ti = it.next();
if(ti.getActorId().equals("DepartmentManager")){
List<Transition> transitions = ti.getToken().getNode().getLeavingTransitions();
for(Transition t : transitions){
System.out.println("----Transition" + t.getName());
}
// assertEquals("DepartmentManager",ti.getActorId());
if(pass){
ti.end("部门经理审批通过"); //对于在tasknode结点中多个transition,用end(transition_name)
}else{ //方法来指向下一个结点
ti.end("部门经理驳回");
}
return;
}
}
}
<task-node name="部门经理审批">
<task name="Task_ManagerApprove">
<assignment class="com.firstflow.task.DepartmentManagerApproveAssignmentHandler"></assignment>
</task>
<transition to="金额判定" name="部门经理审批通过">
<action name="Task_ManagerApproved" class="com.firstflow.action.ManagerApprovedActionHandler"></action>
</transition>
<transition to="结束" name="部门经理驳回">
<action name="Action_ManagerDisapprove" class="com.firstflow.action.ManagerDisapproveActionHandler"></action>
</transition>
</task-node>
分享到:
相关推荐
JBPM_TASK JBPM_TASK FK_TASK_TASKNODE TASKNODE_ 一个NODE可以有多个TASK JBPM_TASK JBPM_TASK FK_TASK_STARTST STARTSTATE_ 一个开始节点可以对应多个TASK JBPM_LOG JBPM_LOG FK_LOG_SOURCENODE SOURCENODE_ ...
JBPM(Java Business Process Management)是一个开源的工作流和业务流程管理系统,用于设计、执行和管理业务流程。在JBPM数据库中,有多个关键的表来存储流程相关的数据,包括流程定义、节点、迁移、动作和事件等。...
- `K`: 任务节点,由`org.jbpm.graph.node.TaskNode`实现。 - `N`: 普通节点,由`org.jbpm.graph.def.Node`实现。 - `R`: 起始状态节点,由`org.jbpm.graph.node.StartState`实现。 - `S`: 状态节点,由`org....
- **FK_TASK_TASKNODE**: 一个节点可以有多个任务关联。 - **FK_NODE_ACTION**: 当前执行的action节点。 - **FK_VARACC_PROCST**: 节点可以访问多个变量。 3. **JBPM_TRANSITION**: 描述流程中的转移或路径,...
- `FK_TASK_TASKNODE` 和 `FK_TASK_STARTST`:一个节点可以有多个任务,开始节点可对应多个任务。 - `FK_LOG_SOURCENODE` 和 `FK_LOG_DESTNODE`:在日志记录中,节点作为转换的起点或终点。 - `FK_NODE_ACTIONACTION...
总结起来,通过巧妙地使用TaskNode和自定义的动作,我们可以模拟实现JBPM中的并发子流程执行。这种方法避免了复杂的实现和Token流转问题,提供了一种相对简洁且有效的并发控制机制。在实际应用中,这种方案可以很好...
`ID_` 是节点的唯一标识,`CLASS_` 描述了节点的类型,如StartState、EndState、TaskNode等。`NAME_` 是节点的名称,`SUBPROCESSDEFINITION_` 用于关联子流程模板。`ISASYNC_` 指定节点是否可以异步执行,`ACTION_` ...
1、流程进入TaskNode节点,执行TaskNode类的execute()方法,该方法首先获得TaskMgmtInstance实例,然后通过它来创建TaskInstance。taskMgmtInstance.createTaskInstance(task, executionContext); 2、在上面的...
JBPM,全称为Java Business Process Management,是一款开源的工作流管理系统,用于实现业务流程自动化。它提供了从设计、部署到执行的全面解决方案,让开发者能够轻松地构建和管理复杂的业务流程。以下是对JBPM新手...
- 任务可以在任务节点(`TaskNode`)下定义,也可以在流程定义节点下定义。 - 默认情况下,流程在任务节点处处于等待状态,直到所有任务完成。 - **jpbm_event**(事件表) - **中文名称**:事件表 - **数据表...
【jbpm实例详解】 jbpm(Java Business Process Management)是一个开源的工作流管理系统,它提供了对业务流程的建模、执行和监控的能力。本实例将详细介绍如何使用jbpm创建一个简单的报销流程。 首先,学习任何...
- CLASS_:节点的类型,如StartState、TaskNode、Decision等。 - NAME_:节点的名称。 - SUBPROCESSDEFINITION_:子流程模版的ID(仅当节点类型为ProcessState时使用)。 - ISASYNC_:标志节点是否支持异步执行...
`ID_`是节点的唯一标识,`CLASS_`指定了节点的类型,如StartState、EndState、TaskNode等。`NAME_`是节点的名称,便于理解流程结构。`SUBPROCESSD`用于表示子流程状态。`ACTION_`字段关联了`JBPM_ACTION`表中的动作...
当流程到达一个TaskNode时,jbpm会调用`AssignmentHandler`的`assign()`方法来决定任务应当分配给哪个用户或用户组。例如,下面的配置将'change nappy'任务交由`NappyAssignmentHandler`处理: ```xml ...
- **CLASS_**: 节点的类型,如StartState、TaskNode、EndState等。 - **NAME_**: 节点的名称。 - **SUBPROCESSDEFINITION_**: 子流程模版的ID,仅当节点类型为ProcessState时使用。 - **ISASYNC_**: 标识节点...
- CLASS_:定义节点的类型,如StartState、EndState、TaskNode等。 - NAME_:节点的名称,便于识别。 - SUBPROCESSDEFINITION_:如果节点类型为ProcessState,表示子流程模版的ID。 - ISASYNC_:指示节点是否...
ID_是节点的标识,CLASS_字段定义了节点类型,如StartState、EndState、TaskNode等。NAME_字段是节点的名称,SUBPROCESSDEFINITION_字段用于记录子流程模版ID。ISASYNC_字段表示节点是否支持异步执行,ACTION_字段...
`CLASS`字段定义了节点类型,如ProcessState、Decision、TaskNode等。`ISASYNC`字段指示节点是否支持异步执行,`ACTION`字段关联到`JBPM_ACTION`表中的动作,`SUPERSTATE`表示节点所属的SuperState,而`PROCESS...
- **TASK** (`FK_TASK_TASKNODE`, `FK_TASK_STARTSTATE`):与任务表(`TASK`)关联,表示节点可以包含多个任务或者作为任务的起始节点。 通过这些关联,我们可以追踪到节点之间的逻辑关系,以及节点上发生的具体事件...