- 浏览: 163143 次
- 性别:
- 来自: 北京
最新评论
-
pg_caolei:
楼主,刚才是为了测试一下提供的功能,不小心点提交了,见谅。呵呵 ...
吐一个泡泡 -
pg_caolei:
[b][/b][i][/i]引用[*][img][/img][ ...
吐一个泡泡 -
logcos:
看不明白。
jbpm 项目实践 1.2 (集成appfuse spring modules) -
flyffa:
sorry,应该是更符合Structured Synchron ...
jbpm 与 工作流模式 鉴别器(Discriminator) -
flyffa:
这个模式好像实现的有问题吧,按照workflow patter ...
jbpm 与 工作流模式 鉴别器(Discriminator)
经过3周的努力,终于看到点收获的希望. 基本实现目前项目的工作流业务需求.
以下例子中 采用了jbpm console 的几个示例用户
项目提交人 : ernie .
主管审批 : bert
会签 : ernie , bert , grover
老板审批 : grover
正常流程: 项目金额 >= 500W RMB
提交项目 --> 主管审批 --> 会签 --> 老板审批 --> 审批通过(结束)
正常流程: 项目金额 < 500W RMB
提交项目 --> 主管审批 --> 会签 --> 审批通过(结束)
其中主管审批, 会签, 老板审批 , 不通过, 全部退回给项目提交人修改.
会签中: 所有人全通过, 则通过. 任何一人不通过, 停止其他会签任务.退回给提交人.
流程定义如下:
会签swimlane class
创建会签任务实现类
结束不通过时结束其他会签任务实现
感谢 tomkoo提供了会签的实现思路.
附件: 为流程定义IMG
以下例子中 采用了jbpm console 的几个示例用户
项目提交人 : ernie .
主管审批 : bert
会签 : ernie , bert , grover
老板审批 : grover
正常流程: 项目金额 >= 500W RMB
提交项目 --> 主管审批 --> 会签 --> 老板审批 --> 审批通过(结束)
正常流程: 项目金额 < 500W RMB
提交项目 --> 主管审批 --> 会签 --> 审批通过(结束)
其中主管审批, 会签, 老板审批 , 不通过, 全部退回给项目提交人修改.
会签中: 所有人全通过, 则通过. 任何一人不通过, 停止其他会签任务.退回给提交人.
流程定义如下:
<?xml version="1.0" encoding="UTF-8"?> <process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="tc_prj_approval"> <swimlane name="initiator" /> <!-- 项目提交人 --> <swimlane name="requester"> <assignment expression="user(ernie)" /> </swimlane> <!-- 主管 --> <swimlane name="chief"> <assignment expression="user(bert)" /> </swimlane> <!-- 老板 --> <swimlane name="boss"> <assignment expression="user(grover)" /> </swimlane> <!-- 会签人 --> <swimlane name="cosinger"> <assignment class="net.chenj.jbpm.sample.CosingerAssiHandler"> </assignment> </swimlane> <start-state name="start"> <task name="tc_prj_newprj" swimlane="initiator"></task> <transition name="to_submit" to="tc_prj_submit"></transition> </start-state> <task-node name="tc_prj_submit"> <task name="tc_prj_submit"></task> <transition name="to_chiefapprove" to="tc_prj_chiefapprove"></transition> </task-node> <task-node name="tc_prj_chiefapprove"> <task name="tc_prj_chiefapprove"></task> <transition name="approve" to="tc_prj_countersign"></transition> <transition name="disapprove" to="tc_prj_submit"></transition> </task-node> <task-node name="tc_prj_countersign" signal="last-wait" create-tasks="false"> <task name="tc_prj_countersign"> <event type="task-end"> <action class="net.chenj.jbpm.sample.TaskEndCountersign"> </action> </event> </task> <event type="node-enter"> <action name="createInstance" class="net.chenj.jbpm.sample.CreateTaskInstanceCountersign"> </action> </event> <transition name="approve" to="amount_decision"></transition> <transition name="disapprove" to="tc_prj_submit"></transition> </task-node> <decision name="amount_decision"> <transition name="to_bossapprove" to="tc_prj_bossapprove"></transition> <transition name="to_end" to="end1"></transition> </decision> <task-node name="tc_prj_bossapprove"> <task name="tc_prj_bossapprove"></task> <transition name="approve" to="end1"></transition> <transition name="disapprove" to="tc_prj_submit"> <condition>#{amount >= 500}</condition> </transition> </task-node> <end-state name="end1"></end-state> </process-definition>
会签swimlane class
package net.chenj.jbpm.sample; import org.jbpm.graph.exe.*; import org.jbpm.taskmgmt.def.*; import org.jbpm.taskmgmt.exe.Assignable; public class CosingerAssiHandler implements AssignmentHandler { private static final long serialVersionUID = 1L; public void assign(Assignable assignable, ExecutionContext executionContext) { // 从数据库或者ldap 读取会签人设置 String[] a = { "ernie", "bert", "grover" }; assignable.setPooledActors(a); } }
创建会签任务实现类
package net.chenj.jbpm.sample; 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 CreateTaskInstanceCountersign 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("tc_prj_countersign"); // 从数据库或者ldap 读取会签人设置创建任务实例 tmi.createTaskInstance(task, token).setActorId("ernie"); tmi.createTaskInstance(task, token).setActorId("bert"); tmi.createTaskInstance(task, token).setActorId("grover"); } }
结束不通过时结束其他会签任务实现
package net.chenj.jbpm.sample; import java.util.Collection; import java.util.Iterator; import org.jbpm.graph.def.ActionHandler; import org.jbpm.graph.exe.ExecutionContext; import org.jbpm.taskmgmt.exe.TaskInstance; import org.jbpm.taskmgmt.exe.TaskMgmtInstance; public class TaskEndCountersign implements ActionHandler { private static final long serialVersionUID = 1L; public void execute(ExecutionContext executionContext) throws Exception { boolean isDisapprove = Boolean.valueOf((String) executionContext .getVariable("isDisapprove")); // 如果有一个任务实例拒绝通过则结束除当前任务实例外其他任务实例 if (isDisapprove) { TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance(); TaskInstance ti = executionContext.getTaskInstance(); final String actorId = ti.getActorId(); Collection c = tmi.getSignallingTasks(executionContext); for (Iterator it = c.iterator(); it.hasNext();) { TaskInstance task = (TaskInstance) it.next(); if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) { task.end("disapprove"); } } } } }
感谢 tomkoo提供了会签的实现思路.
附件: 为流程定义IMG
评论
5 楼
sifutian
2008-10-02
spiritfrog 2008-05-23 回复
if (isDisapprove) {
TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
TaskInstance ti = executionContext.getTaskInstance();
final String actorId = ti.getActorId();
Collection c = tmi.getSignallingTasks(executionContext);
for (Iterator it = c.iterator(); it.hasNext();) {
TaskInstance task = (TaskInstance) it.next();
if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {
task.end("disapprove");
}
}
}
难道不会发生token is locked 这样的错误?
这个问题怎么解决呢?我现在用这种方法解决会签,出现了这个问题,急切等待高手解说!
if (isDisapprove) {
TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
TaskInstance ti = executionContext.getTaskInstance();
final String actorId = ti.getActorId();
Collection c = tmi.getSignallingTasks(executionContext);
for (Iterator it = c.iterator(); it.hasNext();) {
TaskInstance task = (TaskInstance) it.next();
if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {
task.end("disapprove");
}
}
}
难道不会发生token is locked 这样的错误?
这个问题怎么解决呢?我现在用这种方法解决会签,出现了这个问题,急切等待高手解说!
4 楼
spiritfrog
2008-05-23
if (isDisapprove) {
TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
TaskInstance ti = executionContext.getTaskInstance();
final String actorId = ti.getActorId();
Collection c = tmi.getSignallingTasks(executionContext);
for (Iterator it = c.iterator(); it.hasNext();) {
TaskInstance task = (TaskInstance) it.next();
if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {
task.end("disapprove");
}
}
}
难道不会发生token is locked 这样的错误?
TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
TaskInstance ti = executionContext.getTaskInstance();
final String actorId = ti.getActorId();
Collection c = tmi.getSignallingTasks(executionContext);
for (Iterator it = c.iterator(); it.hasNext();) {
TaskInstance task = (TaskInstance) it.next();
if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {
task.end("disapprove");
}
}
}
难道不会发生token is locked 这样的错误?
3 楼
gabriel80
2008-04-24
为什么会没人回答呢?
2 楼
gavin.guo
2007-03-14
我用上面的swimlane 分配了下任务
总是有这样的结果:
New tasks have been assigned to: null, null, null.
我该怎么解决才好?
多谢呀!
总是有这样的结果:
New tasks have been assigned to: null, null, null.
我该怎么解决才好?
多谢呀!
1 楼
gavin.guo
2007-03-14
兄弟,怎么下面的代码都没有用到呀?
<!-- 项目提交人 -->
<swimlane name="requester">
<assignment expression="user(ernie)" />
</swimlane>
<!-- 主管 -->
<swimlane name="chief">
<assignment expression="user(bert)" />
</swimlane>
<!-- 老板 -->
<swimlane name="boss">
<assignment expression="user(grover)" />
</swimlane>
<!-- 会签人 -->
<swimlane name="cosinger">
<assignment class="net.chenj.jbpm.sample.CosingerAssiHandler">
</assignment>
</swimlane>
<!-- 项目提交人 -->
<swimlane name="requester">
<assignment expression="user(ernie)" />
</swimlane>
<!-- 主管 -->
<swimlane name="chief">
<assignment expression="user(bert)" />
</swimlane>
<!-- 老板 -->
<swimlane name="boss">
<assignment expression="user(grover)" />
</swimlane>
<!-- 会签人 -->
<swimlane name="cosinger">
<assignment class="net.chenj.jbpm.sample.CosingerAssiHandler">
</assignment>
</swimlane>
发表评论
-
for download
2008-03-18 20:25 3http://www.softii.com/downinfo/ ... -
文档地址
2008-03-07 09:24 23http://wiki.redsaga.com/conflue ... -
jbpm 与 工作流模式 鉴别器(Discriminator)
2006-11-30 18:04 4209鉴别器(Discriminator) Description ... -
jbpm 与工作流模式 多路聚合(Multiple Merge)
2006-11-27 14:06 2932多路聚合(Multiple Merge) Descripti ... -
jbpm与工作流模式 同步汇聚(Synchronizing Merge)
2006-11-24 18:56 2133同步汇聚(Synchronizing Me ... -
jbpm 使用日记10
2006-11-24 18:05 1460日期: 第五周. 第五天. 经过了近一个多月的努 ... -
jbpm 使用日记9
2006-11-21 16:24 2503日期: 第五周 第 ... -
jbpm 使用日记8
2006-11-20 15:59 1415jbpm 用户组织结构 日期: 第五周, 第一天 ... -
jbpm 与 工作流模式 多路选择(Multiple Choice)
2006-11-17 16:01 7931多路选择(Multiple Choice) Descript ... -
jbpm 与 工作流模式 基本控制模式(三)
2006-11-16 20:25 4304好像源代码功能有点问题. /* * JBoss, Home ... -
jbpm 与 工作流模式 基本控制模式(二)
2006-11-16 20:18 5585xml 代码 <process-defi ... -
jbpm 与 工作流模式 基本控制模式(一)
2006-11-16 16:17 10530工作流模式 本文以jdpl/jar/sr ... -
jbpm 使用日记7
2006-11-15 18:26 1168日期: 第四周 第二天 继续了一天理论知识学 ... -
jbpm 使用日记6 理论知识学习.
2006-11-13 10:54 1555日期: 第四周.第一天 经过jbpm 的一段时间研 ... -
jbpm 使用日记4
2006-11-09 17:49 1558用了整整一天的时间, 实现了个比较简单的会签的功能. ... -
jbpm 使用日记3
2006-11-08 12:01 5474又用了3天,终于对jbpm 集成有了一个比较明确的思路. ... -
jbpm 使用日记2
2006-11-02 14:39 1804改写 jbpm 自带的 应用 jsf 遇到很多问题和工作量. ... -
jbpm 使用日记1
2006-11-01 10:56 2020进度. 1.使用 jbpm 3.1.2 build jbpm. ...
相关推荐
**jbpm简介** jbpm(Java Business ...总之,"jbpm使用简单示例"是一个很好的学习资源,通过它,开发者不仅可以了解jbpm的基本操作,还能掌握如何在实际项目中运用流程管理技术,提升业务系统的灵活性和可维护性。
下面是一个简单的会签任务创建示例: ```java TaskService taskService = ... // 获取TaskService实例 Task task = taskService.createTask(); taskService.addCandidateUser(task.getId(), "user1"); taskService....
JBPM(Java Business Process Management)是一个开源的工作流管理系统,用于管理和执行业务流程。在JBPM4.4版本中,它提供了一个强大的平台来设计、部署和执行复杂的业务流程,其中包括了会签功能。会签,也称为...
在这个流程中,可以设置多个并行的任务节点,每个节点代表一个会签的角色。通过使用边界事件和多实例任务,我们可以实现会签的逻辑。多实例任务允许我们指定一个条件,例如所有参与者的签名都收集完毕,以便结束当前...
总的来说,jbpmDemo通过一个生动的示例,展示了jBPM4如何有效地管理和执行工作流,同时利用Canvas动画增强了用户体验。学习和研究这个示例,不仅可以提升对jBPM4的理解,还能增强在实际项目中应用工作流管理系统的...
JBPM 是一个开源的工作流管理系统,它允许开发者和业务分析师设计、部署和执行业务流程。会签,即多人参与并同意后才能继续流程的步骤,是流程管理中的重要环节,尤其在企业协作和审批流程中常见。 【描述】"简单的...
【jbpm 请假示例 简易 修改版】是一个基于jbpm工作流引擎的简单应用实例,旨在演示如何在企业级环境中实现一个请假流程。jbpm是一个开源的工作流管理系统,它提供了完整的业务流程自动化解决方案,包括流程设计、...
jbpm是一个开源的工作流管理系统,用于帮助开发者实现业务流程自动化。以下是基于给定文件的信息,深入解析jbpm4和jbpm5的知识点: 1. **jbpm4表结构和表字段说明**: jbpm4.3表结构和表字段说明文档通常会详细...
文件名"countersign2"可能表示这是一个关于二次会签或者多阶段会签的示例。在实际应用中,可能包含了一个或多个fork节点来创建并行审批流,以及join节点来等待所有审批结果,确保所有必要的决策都被考虑在内。 在...
JBPM5是JBPM的一个重要版本,提供了更为强大的工作流管理功能,并且支持多种部署方式。 #### 二、下载与安装 ##### 下载JBPM5 - 访问JBPM官方网站(http://www.jboss.org/jbpm5.0final),下载完整的JBPM5安装包。...
示例中包含的TestWorkFolwJBPM可能是一个简单的流程演示,展示了如何使用引擎启动和控制流程。 7. **集成能力(Integration Capabilities)**:JBPM4.3可以与其他Java应用无缝集成,例如Spring框架。此外,还支持...
在jbpm中,流程部署是将一个流程定义文件(通常是.bpmn或.jpdl格式)上传到jbpm服务器的过程。这个文件包含了流程的所有细节,如活动、任务、网关等。部署后,这些流程就可以被实例化并执行。你可以通过jbpm提供的...
jBPM 4提供了一个图形化的流程建模工具——jBPM Designer,通过它可以使用BPMN 2.0语言创建流程模型。设计师允许用户拖放活动、事件、网关等元素,实现流程的可视化设计,同时支持导出为XML格式的流程定义文件(....
在实现会签时,我们可以创建一个custom节点,然后在其中编写Java代码或者使用脚本来处理会签逻辑,包括分配任务给审批人、处理审批结果以及根据需要进行加签或减签操作。 加签功能是在流程运行过程中,根据业务需求...
这个示例项目提供了一个全面展示JBPM功能的平台,它可以在多种数据库环境和Web服务器上运行,展现了其强大的兼容性和灵活性。 JBPM的核心功能包括工作流定义、流程实例管理、任务分配、事件处理以及报表生成等。它...
jbpm(Java Business Process Management)是一个开源的工作流和业务流程管理框架,主要用于设计、执行和管理复杂的业务流程。会签,又称多人签名或并行审批,是jbpm中的一种常见功能,它允许流程中的多个参与者同时...
- 设计流程图:首先,你需要使用Drools工作流编辑器创建一个包含会签节点的流程图。 - 配置任务节点:在会签节点上设置多个人员或组作为参与者,定义审批顺序(串行或并行)。 - 实现加签和减签逻辑:编写Java...
7. **创建第一个jbpm流程**:在Eclipse中,使用jbpm插件创建一个新的工作流项目,设计并编写流程定义文件(.bpmn或.bpmn2),并编译生成流程定义的XML文件。 8. **部署和测试流程**:将流程部署到Guvnor,然后在...
使用Ant执行`install.demo`脚本,这将根据`build.xml`文件自动下载并安装jBPM5所需的一系列依赖组件,包括但不限于: - BIRT运行时环境 - jBPM设计师插件 - Drools规则引擎及其Eclipse插件 - Eclipse IDE - GEF SDK...