《JBPM流程通过Aciton动态创建TaskInstance来实现“会签”》2
2011-12-14 10:19
645 查看
前面写过一篇文章《JBPM流程通过Aciton动态创建TaskInstance来实现“会签”》,不过那篇文章可以说是一个大体思路的简单实现,并不完整,也有不少朋友提出了不少的问题。因为做事要善始善终,所以再次贴出这一主题,把会签进行到底。
参考文章:
JBPM流程通过Aciton动态创建TaskInstance来实现“会签”
JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(1)
第一步还是给出一个新的ProcessDefinition.xml流程定义文件:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201212/7a1e7afc0f2addbbdb746966b60e9e4a.png)
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="资金归集">
<start-state name="启动">
<transition name="" to="制单"></transition>
</start-state>
<task-node name="制单">
<task name="制单">
<assignment actor-id="#{processStarter}"></assignment>
</task>
<transition name="送复核" to="复核"></transition>
</task-node>
<task-node name="复核">
<task name="复核">
<assignment class="com.sky.plugin.jbpm.def.ActorsHandel">
</assignment>
</task>
<transition name="拒绝复核" to="制单"></transition>
<transition name="提交审批" to="审批"></transition>
</task-node>
<task-node name="审批" signal="last-wait" create-tasks="false" end-tasks="true">
<task name="审批">
</task>
<event type="node-enter">
<action name="createInstance"
class="com.sky.plugin.jbpm.def.DynamicCreateTaskInstance">
</action>
</event>
<event type="task-end">
<action name="createInstance"
class="com.sky.plugin.jbpm.def.ConuntersignActionHandler">
</action>
</event>
<transition name="同意" to="结束">
<action name="createInstance"
class="com.sky.plugin.jbpm.def.TestActionHandel">
</action>
</transition>
<transition name="拒绝到复核人" to="复核"></transition>
</task-node>
<end-state name="结束"></end-state>
</process-definition>
这里除了“文章1”说到要注意的地方外,还要注意的两个地方是:
1. <event type="node-enter">
进入流程节点的时候,执行ActionHandler类com.sky.plugin.jbpm.def.DynamicCreateTaskInstance,用来动态生成TaskInstance。
2. <event type="task-end">
Task结束的时候调用com.sky.plugin.jbpm.def.ConuntersignActionHandler进行会签处理。判断会签路径来决定会签的执行和走向。
com.sky.plugin.jbpm.def.DynamicCreateTaskInstance
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201212/7a1e7afc0f2addbbdb746966b60e9e4a.png)
public class DynamicCreateTaskInstance implements ActionHandler {
private static final long serialVersionUID = 1L;
public void execute(ExecutionContext context) throws Exception {
ProcessDefinition processDefinition = context.getProcessDefinition();
TaskNode taskNode = (TaskNode) context.getNode();
Task task = (Task)taskNode.getTasks().iterator().next();
Long processDefinitionId = processDefinition.getId();
Long taskId = task.getId();
Token token = context.getToken();
TaskMgmtInstance tmi = context.getTaskMgmtInstance();
//获取自定义的进行会签的人员
ServiceFactory serviceFactory = ServiceFactory.getInstance();
ProcessService ps = serviceFactory.getProcessService();
String[] actors = ps.loadTaskActors(processDefinitionId, taskId);
//根据会签人员,每人创建一个TaskInstance
for(String actor : actors){
tmi.createTaskInstance(task, token).setActorId(actor);
}
}
}
com.sky.plugin.jbpm.def.ConuntersignActionHandler
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201212/7a1e7afc0f2addbbdb746966b60e9e4a.png)
public class ConuntersignActionHandler implements ActionHandler {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
public void execute(ExecutionContext context) throws Exception {
Token token = context.getToken();
TaskMgmtInstance tmi = context.getTaskMgmtInstance();
Collection<TaskInstance> unfinishedTasks = tmi
.getUnfinishedTasks(token);
Object variable = context.getVariable("selectedTransition");
String selectedTransition;
if (variable == null) {
throw new RuntimeException(
"Jbpm transition error: user selected transition is null!");
} else {
// 获取当前TaskInstance选择的路径
selectedTransition = variable.toString();
}
// 如果用户选择的路径是流程定义中制定的不通过的路径,则自动完成余下所有的会签Task并转到相应路径
if (selectedTransition.equals("拒绝到复核人")) {
for (TaskInstance unfinishedTaskInstance : unfinishedTasks) {
// 把被结束的没有完成的TaskInstance的ActorId改为automatic complete
if (!unfinishedTaskInstance.hasEnded()) {
unfinishedTaskInstance.setActorId("automatic complete");
unfinishedTaskInstance.end("拒绝到复核人");
}
}
}
}
}
这个类对于会签是至关重要的,要通过这个Action来判断会签的情况。在这个Action中有这样几句代码:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201212/7a1e7afc0f2addbbdb746966b60e9e4a.png)
Object variable = context.getVariable("selectedTransition");
String selectedTransition;
if (variable == null) {
throw new RuntimeException(
"Jbpm transition error: user selected transition is null!");
} else {
// 获取当前TaskInstance选择的路径
selectedTransition = variable.toString();
}
其中的selectedTransition是用户选择的路径,也就是通过这个来判断会签的用户选择了“同意”或者“拒绝到复核人”,你可以通过流程变量的形式来保存。
如果“同意”,则继续下去,直到该TaskNode中所有的TaskInstance完成以后,通过会签,继续下去,如果选择“拒绝到复核人”,则会自动完成余下的所有TaskInstance,然后转到Transition“拒绝到复核人”,会签不通过。
其中有一句,设置所有自动完成的TaskInstance的Actor为“automatic complete”,这个可以解决在“以办事务”中出现自动完成的任务(TaskInstance)
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201212/7a1e7afc0f2addbbdb746966b60e9e4a.png)
unfinishedTaskInstance.setActorId("automatic complete");
到这里整个会签的实现都在这里了,行文有点乱。哈哈!
参考文章:
JBPM流程通过Aciton动态创建TaskInstance来实现“会签”
JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(1)
第一步还是给出一个新的ProcessDefinition.xml流程定义文件:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201212/7a1e7afc0f2addbbdb746966b60e9e4a.png)
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="资金归集">
<start-state name="启动">
<transition name="" to="制单"></transition>
</start-state>
<task-node name="制单">
<task name="制单">
<assignment actor-id="#{processStarter}"></assignment>
</task>
<transition name="送复核" to="复核"></transition>
</task-node>
<task-node name="复核">
<task name="复核">
<assignment class="com.sky.plugin.jbpm.def.ActorsHandel">
</assignment>
</task>
<transition name="拒绝复核" to="制单"></transition>
<transition name="提交审批" to="审批"></transition>
</task-node>
<task-node name="审批" signal="last-wait" create-tasks="false" end-tasks="true">
<task name="审批">
</task>
<event type="node-enter">
<action name="createInstance"
class="com.sky.plugin.jbpm.def.DynamicCreateTaskInstance">
</action>
</event>
<event type="task-end">
<action name="createInstance"
class="com.sky.plugin.jbpm.def.ConuntersignActionHandler">
</action>
</event>
<transition name="同意" to="结束">
<action name="createInstance"
class="com.sky.plugin.jbpm.def.TestActionHandel">
</action>
</transition>
<transition name="拒绝到复核人" to="复核"></transition>
</task-node>
<end-state name="结束"></end-state>
</process-definition>
这里除了“文章1”说到要注意的地方外,还要注意的两个地方是:
1. <event type="node-enter">
进入流程节点的时候,执行ActionHandler类com.sky.plugin.jbpm.def.DynamicCreateTaskInstance,用来动态生成TaskInstance。
2. <event type="task-end">
Task结束的时候调用com.sky.plugin.jbpm.def.ConuntersignActionHandler进行会签处理。判断会签路径来决定会签的执行和走向。
com.sky.plugin.jbpm.def.DynamicCreateTaskInstance
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201212/7a1e7afc0f2addbbdb746966b60e9e4a.png)
public class DynamicCreateTaskInstance implements ActionHandler {
private static final long serialVersionUID = 1L;
public void execute(ExecutionContext context) throws Exception {
ProcessDefinition processDefinition = context.getProcessDefinition();
TaskNode taskNode = (TaskNode) context.getNode();
Task task = (Task)taskNode.getTasks().iterator().next();
Long processDefinitionId = processDefinition.getId();
Long taskId = task.getId();
Token token = context.getToken();
TaskMgmtInstance tmi = context.getTaskMgmtInstance();
//获取自定义的进行会签的人员
ServiceFactory serviceFactory = ServiceFactory.getInstance();
ProcessService ps = serviceFactory.getProcessService();
String[] actors = ps.loadTaskActors(processDefinitionId, taskId);
//根据会签人员,每人创建一个TaskInstance
for(String actor : actors){
tmi.createTaskInstance(task, token).setActorId(actor);
}
}
}
com.sky.plugin.jbpm.def.ConuntersignActionHandler
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201212/7a1e7afc0f2addbbdb746966b60e9e4a.png)
public class ConuntersignActionHandler implements ActionHandler {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
public void execute(ExecutionContext context) throws Exception {
Token token = context.getToken();
TaskMgmtInstance tmi = context.getTaskMgmtInstance();
Collection<TaskInstance> unfinishedTasks = tmi
.getUnfinishedTasks(token);
Object variable = context.getVariable("selectedTransition");
String selectedTransition;
if (variable == null) {
throw new RuntimeException(
"Jbpm transition error: user selected transition is null!");
} else {
// 获取当前TaskInstance选择的路径
selectedTransition = variable.toString();
}
// 如果用户选择的路径是流程定义中制定的不通过的路径,则自动完成余下所有的会签Task并转到相应路径
if (selectedTransition.equals("拒绝到复核人")) {
for (TaskInstance unfinishedTaskInstance : unfinishedTasks) {
// 把被结束的没有完成的TaskInstance的ActorId改为automatic complete
if (!unfinishedTaskInstance.hasEnded()) {
unfinishedTaskInstance.setActorId("automatic complete");
unfinishedTaskInstance.end("拒绝到复核人");
}
}
}
}
}
这个类对于会签是至关重要的,要通过这个Action来判断会签的情况。在这个Action中有这样几句代码:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201212/7a1e7afc0f2addbbdb746966b60e9e4a.png)
Object variable = context.getVariable("selectedTransition");
String selectedTransition;
if (variable == null) {
throw new RuntimeException(
"Jbpm transition error: user selected transition is null!");
} else {
// 获取当前TaskInstance选择的路径
selectedTransition = variable.toString();
}
其中的selectedTransition是用户选择的路径,也就是通过这个来判断会签的用户选择了“同意”或者“拒绝到复核人”,你可以通过流程变量的形式来保存。
如果“同意”,则继续下去,直到该TaskNode中所有的TaskInstance完成以后,通过会签,继续下去,如果选择“拒绝到复核人”,则会自动完成余下的所有TaskInstance,然后转到Transition“拒绝到复核人”,会签不通过。
其中有一句,设置所有自动完成的TaskInstance的Actor为“automatic complete”,这个可以解决在“以办事务”中出现自动完成的任务(TaskInstance)
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201212/7a1e7afc0f2addbbdb746966b60e9e4a.png)
unfinishedTaskInstance.setActorId("automatic complete");
到这里整个会签的实现都在这里了,行文有点乱。哈哈!
相关文章推荐
- JBPM流程通过Aciton动态创建TaskInstance来实现“会签”
- JBPM流程通过Aciton动态创建TaskInstance来实现“会签”
- JBPM流程通过Aciton动态创建TaskInstance来实现“会签”
- jbpm3.2 Aciton动态创建TaskInstance来实现“会签”
- 通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的操作的简单的实现流程
- 通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的操作的简单的实现流程
- js动态创建上传表单通过iframe模拟Ajax实现无刷新
- php 通过__callStatic魔术方法实现方法的动态创建和延迟绑定
- JAVA动态模块的设计实现以及如何通过newInstance()来创建带参的构造类实例
- (设计模式)简单工厂模式之通过配置文件动态创建实现类
- CCRenderTexture(动态创建纹理类 ---通过OpenGL方法 可以实现截屏功能)
- Activiti通过API动态创建流程
- 使用JBPM实现动态会签
- Jbpm流程如何实现“会签”的问题
- 【代码篇】JBPM4.4开发流程节点(动态代理实现流程管理业务)
- 通过动态创建表来实现成绩存放
- js动态创建上传表单通过iframe模拟Ajax实现无刷新
- Swift微博项目--Swift中通过类名字符串创建类以及动态加载控制器的实现
- 通过PHP创建动态的FLASH图表和地图.
- Fragment通过hide、show实现动态切换