- 浏览: 96575 次
- 来自: ...
最新评论
-
gongcheneric:
如果我是要在一个局域网内的某台电脑上修改其他电脑(已知电脑的I ...
java 修改系统时间 -
lijunlong:
...
java 修改系统时间 -
jljf_hh:
喔,了解一下,正好没时间研究这东西呢.哈哈
JBPM阶段性工作总结 -
yuyanshan:
你好,我也是这们做的不,不过我还不明白怎么处理任务,我是这样想 ...
会签实现
转载自http://tomkoo.iteye.com/blog/34204
JBPM流程通过Aciton动态创建TaskInstance来实现“会签”(续)
关键字: JBPM 会签 会办 Task TaskInstance
前面写过一篇文章《JBPM流程通过Aciton动态创建TaskInstance来实现“会签”》,不过那篇文章可以说是一个大体思路的简单实现,并不完整,也有不少朋友提出了不少的问题。因为做事要善始善终,所以再次贴出这一主题,把会签进行到底。
参考文章:
JBPM流程通过Aciton动态创建TaskInstance来实现“会签”
JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(1)
第一步还是给出一个新的ProcessDefinition.xml流程定义文件:
这里除了“文章1”说到要注意的地方外,还要注意的两个地方是:
com.sky.plugin.jbpm.def.DynamicCreateTaskInstance
com.sky.plugin.jbpm.def.ConuntersignActionHandler
这个类对于会签是至关重要的,要通过这个Action来判断会签的情况。在这个Action中有这样几句代码:
其中的selectedTransition是用户选择的路径,也就是通过这个来判断会签的用户选择了“同意”或者“拒绝到复核人”,你可以通过流程变量的形式来保存。
如果“同意”,则继续下去,直到该TaskNode中所有的TaskInstance完成以后,通过会签,继续下去,如果选择“拒绝到复核人”,则会自动完成余下的所有TaskInstance,然后转到Transition“拒绝到复核人”,会签不通过。
其中有一句,设置所有自动完成的TaskInstance的Actor为“automatic complete”,这个可以解决在“以办事务”中出现自动完成的任务(TaskInstance)
到这里整个会签的实现都在这里了,行文有点乱。哈哈!
参考文章:
JBPM流程通过Aciton动态创建TaskInstance来实现“会签”
JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(1)
第一步还是给出一个新的ProcessDefinition.xml流程定义文件:
- <?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>
<?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
- 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);
- }
- }
- }
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
- 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("拒绝到复核人");
- }
- }
- }
- }
- }
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中有这样几句代码:
- 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();
- }
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)
unfinishedTaskInstance.setActorId("automatic complete");
到这里整个会签的实现都在这里了,行文有点乱。哈哈!
评论
1 楼
yuyanshan
2008-08-06
你好,我也是这们做的不,不过我还不明白怎么处理任务,我是这样想的:
但是当程序运行到ti.end()的时个它就把无法取得当前令牌的锁,你知道这是什么原因吗?
TaskInstance ti = jbpmContext.getTaskInstance(Long.parseLong(taskId)); if("yes".equals(result)) { ti.setVariable("isDisapprove", true); } if("no".equals(result)) { ti.setVariable("isDisapprove", false); } ti.end();
但是当程序运行到ti.end()的时个它就把无法取得当前令牌的锁,你知道这是什么原因吗?
发表评论
-
节点描述
2008-08-07 21:59 1179对jBPM来讲,工作流由一 ... -
sample
2008-08-07 21:12 901xml配置 <start-state ... -
tasknode
2008-08-07 21:07 870同fork等一样是一种节点类型。任务节点是jbpm中一个非常重 ... -
controller
2008-07-31 20:44 921controller(控制器) \28在任务执行时,可能需要 ... -
exception-handler
2008-07-31 20:43 1846exception-handler 异常处理 jbpm异常 ... -
spring和jbpm事务一致性
2008-07-31 20:24 2832关于jbpm和spring结合的事务问题: 当JBPM使用sp ... -
知识点
2008-07-31 10:25 913Node Type ... -
ssh-jbpm发布遇到的问题
2008-07-30 10:04 15411.自己输入http://localhost:8080/ssh ... -
发布jbpm示例shipping遇到的问题
2008-07-28 18:09 10531 jstl和jsp2.0版本问题 <%@taglib ... -
jbpm解析流程定义
2008-07-27 19:25 1014jbpm解析流程定义有三种方式:1)par包static Pr ... -
Jbpm学习知识点
2008-07-26 21:32 1109如何运行Jbpm的示例程序?如何部署Jbpm?如何安装Jbp ... -
Tomcat+mysql 配置
2008-07-26 09:24 1405JBoss JBPM 实践系列(一)--- 安装配置(Tomc ... -
业务流程设计
2008-07-26 09:01 1710转载自http://linliangyi2007.iteye. ... -
jBPM相关概念
2008-07-26 08:25 848转载自http://fndcz.iteye.com/blog/ ... -
jbpm资源
2008-07-26 07:59 832ant和发布 http://fndcz.iteye.com/ ... -
jbpm任务分配分析
2008-07-26 07:53 2201jbpm任务分配分析 任务 ... -
JBPM源码浅析
2008-07-26 07:40 1126转载自 http://zwchen.iteye.com/blo ... -
JBPM阶段性工作总结
2008-07-26 07:37 1540转载自http://zwchen.iteye.co ... -
eclipse的jbpm插件配置
2008-07-25 17:36 4733eclipse版本3.2.2 1. jbpm插件从jbpm-s ...
相关推荐
【标题】"Activiti多实例任务实现会签"是指在Activiti工作流引擎中,如何配置和使用多实例任务来实现会签功能。在企业级应用中,会签常常用于决策过程,要求多个参与者共同审批,只有当所有参与者都完成审批后,流程...
通过学习"CountersignDemo"这个实例,你可以深入了解JBPM4.4的会签实现,包括如何设计流程、创建自定义活动、编写工具类以及如何在实际应用中部署和使用。这将有助于提升你对业务流程管理的理解,使你能更好地为企业...
下面我们将详细探讨如何在Activiti-5.4中实现会签以及相关的技术细节。 首先,理解会签的概念。在工作流中,会签是指一个任务可以被分配给多个用户或组,每个参与者都可以独立完成任务,而无需等待其他人的操作。在...
本文将深入探讨如何在OSWorkflow中实现动态会签功能,这是一种在多个参与者之间灵活分配任务的关键特性。 OSWorkflow是由OpenSymphony团队开发的,它提供了一个基于Java的API,使得开发者可以轻松地在应用中集成...
【jbpm4.3 会签的实现】 在企业级工作流管理系统中,会签(Concurrence Signature)是一种常见的审批流程模式,它允许多个审批人同时参与同一个任务的处理,只有当所有指定的审批人都完成他们的操作后,任务才会被...
在Activiti工作流引擎中,会签功能是通过多实例任务(Multi-instance Task)来实现的。这使得流程能够根据特定的规则分配给多个参与者,且这些参与者可以同时进行处理。 **会签类型** 1. **按数量通过**:当参与...
综上所述,这个主题深入探讨了如何利用 Activiti 的会签功能和自定义组件来实现投票统计和结束条件控制,展示了 Activiti 在复杂业务场景中的灵活性和可扩展性。在实际应用中,开发者可以参考这些组件和流程设计,...
2. **工作流引擎**:会签功能的实现离不开工作流引擎的支持,如Activiti、Camunda等。这些引擎能够解析流程定义模型,并根据业务逻辑驱动流程实例的执行。 3. **参与者分配**:确定谁参与会签至关重要。可以基于...
在实现会签时,我们可以创建一个custom节点,然后在其中编写Java代码或者使用脚本来处理会签逻辑,包括分配任务给审批人、处理审批结果以及根据需要进行加签或减签操作。 加签功能是在流程运行过程中,根据业务需求...
本主题聚焦于"工作流开发会签两套方案(Java源代码实现)",我们将深入探讨两种Java实现会签功能的方法,并结合JBPM(Java Business Process Management)框架,为你揭示如何高效地构建这样的系统。 首先,我们需要...
本文将深入探讨如何在jbPM中实现会签以及加签、减签功能,并提供相关实践指导。 1. **会签概念与实现** 会签是指在流程中设置一个环节,需要多个参与者依次或同时进行审批。jbPM通过定义工作流模型,利用task节点...
【专题讲解】工作流引擎会签,加签,主持人,组长模式专题讲解 工作流引擎在企业管理和自动化流程中扮演着重要角色...通过这些特性,ccflow致力于打造最易用的工作流引擎,服务于社会,实现流程管理的便捷化和自动化。
通过分析这个文件,开发者可以深入理解如何在实际项目中应用WF4.0的多书签功能来实现会签流程。 总之,WF4.0的多书签机制为创建复杂的、协作式的业务流程提供了强大的工具。通过理解和掌握这些知识点,开发者能够...
在本案例中,"BN156-会签系统"是一个使用ASP.NET技术实现的会签流程管理系统,主要用于企业或组织内部的文档审批、流程协作等场景。 1. **会签系统概念** 会签系统是指一种工作流管理系统,它允许多个审批者按照...
在本教程中,我们将深入探讨jbpm中的会签和串签功能,以及如何进行流程部署、启动流程、任务提交、查询已办和待办任务。 首先,让我们了解流程部署的概念。在jbpm中,流程部署是将一个流程定义文件(通常是.bpmn或....
### Activiti多实例任务实现会签功能详解 #### 一、多实例用户任务的基本概念与配置 Activiti是一个开源的工作流引擎,它提供了一种灵活的方式来定义业务流程,并且能够支持复杂的业务逻辑处理。其中,多实例任务...