`
tomkoo
  • 浏览: 184777 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JBPM流程通过Aciton动态创建TaskInstance来实现“会签”

    博客分类:
  • JBPM
阅读更多
    昨天在Jbpm-inside群里面和大家讨论了在Jbpm流程中,如何实现“会签”的问题,最后得出了两种方案。今天就这两种思想中的一种:通过Aciton动态创建TaskInstance来实现“会签”,自己实现了一把,成功了!

     1. 创建processDefinition.xml流程定义文件,如下:

<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="webPay">
	<swimlane name="PooledActors">
		<assignment class="com.sky.plugin.jbpm.ActorHandel"></assignment>
	</swimlane>
	<start-state name="网上支付审批流程">
		<transition name="开始" to="财务人员录入"></transition>
	</start-state>
	<task-node name="财务人员录入">
		<task name="财务人员录入申报数据" swimlane="PooledActors"></task>
		<transition name="主管会计复核" to="主管会计复核"></transition>
	</task-node>
	<task-node name="主管会计复核" signal="last-wait" create-tasks="false">
		<task name="主管会计复核" swimlane="PooledActors"></task>
		<event type="node-enter">
			<action name="createInstance"
		class="com.sky.plugin.jbpm.CreateTaskInstance">
			</action>
		</event>
		<transition name="复核通过" to="领导审批"></transition>
		<transition name="复核不通过" to="异常结束"></transition>
	</task-node>
	<task-node name="领导审批">
		<task name="领导审批" swimlane="PooledActors"></task>
		<transition name="同意" to="结束"></transition>
		<transition name="不同意" to="异常结束"></transition>
	</task-node>
	<end-state name="结束"></end-state>
	<end-state name="异常结束"></end-state>
</process-definition>


task-node"主管会计复核"则是我们需要进行会签的节点。在这个节点我们设置了几个重要的属性:

    1) signal="last-wait",这个属性决定了该节点将在完成该节点内的所有Task的TaskInstance以后才会进入下一个节点。)

    2) create-tasks="false",这个属性决定了在进入该节点的时候,不会自动为该节点的任何Task创建任何的TaskInstance。因为我们需要根据会签的人员来自己创建TaskInstance。

    3) action,action的设定是为了,在Action中根据实际的情况来创建TaskInstance



    2. 编写Action代码

import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.exe.Token;
import org.jbpm.graph.node.TaskNode;
import org.jbpm.taskmgmt.def.Task;
import org.jbpm.taskmgmt.exe.TaskMgmtInstance;

public class CreateTaskInstance implements ActionHandler {

	private static final long serialVersionUID = 1L;

	public void execute(ExecutionContext executionContext) throws Exception {
		Token token = executionContext.getToken();
		TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();

		TaskNode taskNode = (TaskNode) executionContext.getNode();
		Task task= taskNode.getTask("主管会计复核");
		tmi.createTaskInstance(task, token)
                      .setPooledActors(new String[]{"1000"});
		tmi.createTaskInstance(task, token)
                      .setPooledActors(new String[]{"1001"});

	}

}


当然,在实际情况中.setPooledActors(new String[]{"100"})中设置的actor应该是动态指定的,这里为了简单方便就直接写入的固定值。

    3.部署运行,OK!

    注意:如果在给TaskInstance指定Actor的时候是使用.setActor()方法的话,那么在获取用户任务列表的时候用.findTaskInstances();如果是用.setPooledActors(),则需要使用.findPolledTaskInstance()方法。[list][/list]
分享到:
评论
10 楼 lxhxklyy 2013-03-11  
楼主,求代码,新手,什么也不会啊,624479627@qq.com
9 楼 zwm 2007-08-26  
谢谢你们,希望继续写一些这方面的文章
8 楼 zwm 2007-08-26  
谢谢你们,希望继续写一些这方面的文章
7 楼 jamjar 2007-03-09  
太感谢了,正在做这个
6 楼 coolfish 2006-11-22  
写的不错!!其实JBPM对授权是很灵活的,我的理解是 在流程设计中将task指定给一堆人(pooled actors),但是任务的执行总是要具体人完成的,在这个角色的人进来以后,可以在task上setActor,这里我注意到jbpm默认的是将相关的swimlane的actor也设置为这个人,在流程中其他再遇到这个swimlane的时候,task的assign就直接将swimlane的复制过去,task的actor自然而然也是这个人了.当然我们也可以直接指定个人完成的任务.
5 楼 chenjin 2006-11-09  
这种方法似乎有问题, 我试了一下, 当多个人会签时,流程只是转向最后一个人决定的方向. 我现在也面临着会签的需求.
4 楼 tomkoo 2006-10-23  
mygol,现在研究JBPM的朋友很少,看来我们的项目都需要用到JBPM,在Blog上面留言,交流起来实在有点慢,让人感觉很不爽!可以留下你的MSN或者QQ吗?

我先留下我的:

MSN:love4yue4@hotmail.com
QQ: 12203151
3 楼 mygol 2006-10-20  
jbpm的test里面有个Wfp09DiscriminatorTest可以满足我的需求。但是对于已经完成的Task再想撤销,在node1后面再加个cancelnode吧。如果node2到达join那么取消node1分支令牌
2 楼 tomkoo 2006-10-18  
mygol,首先谢谢你的鼓励。由于请了婚假,所以现在才回复,见谅!

我现在也遇到跟你同样的问题:当流程已经流传到Node2了,但是Node2的Actors并没有对这个Node2的Tasks进行处理,这个时候,Node1的Actor却想撤销他已经完成的Task;但是如果Node2的Actor比较勤快,已经对Node2的Task处理了,这个时候Node1的Actor就没有办法撤销了。

我把这样的情况叫做“流程回收”,我现在已经有点一些思路,但是不很清晰,如果实现了我会贴出来,也希望发表你的看法!
1 楼 mygol 2006-10-11  
写得非常好。
我现在遇到一个问题:当请假人写好请假单后转到经理审合。在经理没审合之前请假人可以取消请假单。经理审合后不能取消请假单。我想用FORK-jion来做。当一个分支到达以后怎么样取消另一个分支。

相关推荐

Global site tag (gtag.js) - Google Analytics