`
zybing
  • 浏览: 455826 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jBPM4.4: 动态创建执行路径 -- 类似与会签等

阅读更多

工作场景: 有一项任务需要完成,不同的部门领导根据实际情况,有的交给一个人完成,有的会交给2、3甚至更多的人完成,这个时候,流程就是由程序进行设置了,而无法在画流程图的时候写死了。

 

找到了一些资料:

如:

http://yy629.iteye.com/blog/660701 --- 比较全面

http://phoenix-clt.iteye.com/blog/428242

 

做了一下,可以通过设置subtask来创建会签流程,有问题正在解决:

1. 如果会签中的一员已经signal了,而其他人还没有完成,怎么把这个subtask complete掉,否则只要其他人没有结束,这个人就是signal了,还是看到这个任务;

   在signal中,把ActivityExecution转成ExecutionImpl,调用其getExecution().end即可,这样这个人的会签就结束了;

2. 在例子中,加入的subtask,都需要在HistoryTaskImpl中进行addsubtask,现在一到这里就会发生Exception;

3. 还没有做回退的功能

4.

 

 

 

http://yy629.iteye.com/blog/660701 --- 比较全面

 

一些说明:

 

创建流程

 

在execute方法中,创建subTask

1. 首先创建一个task,将这个task存盘(通过DbSession)

//创建会签任务  

// DBSession: DbSession dbsession = EnvironmentImpl.getFromCurrent(DbSession.class);  
// execution: execute方法的参数

private TaskImpl createCounterSignTask(DbSession dbsession,  ExecutionImpl execution) {  
   // 创建一个新Task
  TaskImpl task = dbsession.createTask();  
  task.setName(execution.getActivityName() + "_会签");  

  // 设置了type, 便于以后做流程展示时区别   -- 暂时没有清楚作用
  execution.getActivity().setType(COUNTER_SIGN_TASK_TYPE);   

  task.setExecution(execution);  
  task.setProcessInstance(execution.getProcessInstance());  

  task.setSignalling(false); //  false, 自己手工处理execution的跳转  
  task.setFormResourceName(form);  
  task.setDescription(description);  

  // 存盘,非常重要,获取到task的id
  dbsession.save(task);  

  // 这个应该和历史事件等相关,目前还不清楚
  HistoryEvent.fire(new TaskActivityStart(task), execution);  
  return task;  
}  
 

2. 创建这个task的subTask,根据人数,每个人一个subtask

 

// 创建会签子任务 这里才是真正的会签任务..  

// 函数参数中的execution:是execute方法中的execution

private void newCounterSignSubTask(DbSession dbsession, ExecutionImpl execution,   
       TaskImpl task, String user, HistoryTaskImpl ht) {  
  // 开始创建sub task
  TaskImpl subtask = task.createSubTask();  
   // 设置一些属性
  subtask.setName(execution.getActivityName() + "$" + user);  
  subtask.setAssignee(user);  
  subtask.setSignalling(false); //  false, 自己手工处理execution的跳转  

  // 这里用的都是父execution,自己写的时候曾经搞错过,错误查都查不出来
  ExecutionImpl exec = execution.createExecution(); // 创建子Execution  
  ActivityImpl activity = execution.getActivity();  
  activity.setType(COUNTER_SIGN_SUB_TASK_TYPE); // 设置类型, 便于区别  
  exec.setActivity(activity);  
  exec.setState(Execution.STATE_ACTIVE_CONCURRENT); // 再设置原来的type  
  exec.setHistoryActivityStart(Clock.getCurrentTime());  

  // sub task对应的是 子execution
  subtask.setExecution(exec);  
  
  subtask.setFormResourceName(form);  
  subtask.setDescription(description);  
  
  // 也是需要持久化的,存盘
  dbsession.save(subtask);  
  
  // 下面的这些暂未看,以后再研究
  // 修改了jbpm4中的源码, 主要是用来计算任务的url的, 把其中的占位符替:{TASK_ID}换为该task的task id  
  TaskActivity.replaceTaskResourceFormTaskIdMarco(subtask);  
  
  HistoryEvent.fire(new TaskActivityStart(subtask), exec);  
  ht.addSubTask(dbsession.get(HistoryTaskImpl.class, subtask.getDbid()));  
}  
 

Signal的实现

1. signalName,作为了审核答复

2. 把task作为map中的一个参数,传给了Signal方法(在signal方法中,通过execution.getTask获取的task,是个null

3.

4. 将所有的会签结果,放在ProcessInstance的variable中,这样在整个流程中可见

 

通过传给signal方法的subtask,获取到父Task,通过这个父task,可以获取到其他所有的subtask,把这些task、execution停止;

List<Task> subTaskList = taskService.getSubTasks(task.getId());   // 这个task是父task
if (subTaskList != null && subTaskList.size() > 1) {   
 // 处理未完成的会签子任务  
  String assignee = theSubTask.getAssignee();  
  for (Task subTask : subTaskList) {  
    if (!assignee.equals(subTask.getAssignee())) {  
      TaskImpl subTaskImpl = (TaskImpl) subTask;  
      subTaskImpl.setSuperTask(null);  
      taskService.completeTask(subTaskImpl.getId(), COUNTER_SIGN_SUB_TASK_CANEL_STATE);  
      subTaskImpl.getExecution().end(COUNTER_SIGN_SUB_EXECUTION_END_STATE); // 结束execution  
    }  
  }  
}  
 

下面是处理转向的流程

// 定义一个转向
Transition transition = null;  
// 获得当前的activity
Activity activity = executionImpl.getActivity();  

// 找到这个转向
if ((outcome == null)  
    || outcome.length() == 0  
    || ((Task.STATE_COMPLETED.equals(outcome) || TaskConstants.NO_TASK_OUTCOME_SPECIFIED.equals(outcome))  
        && (activity.getOutgoingTransitions() != null) && (activity.getOutgoingTransitions().size() == 1))) {  
  transition = activity.getOutgoingTransitions().get(0);  
} else {  
  transition = activity.findOutgoingTransition(outcome);  
}  

String transitionName = transition == null ? null : transition.getName();  
variables.put(transtionName, transitionName);

// 完成父任务,进行转向 
taskService.completeTask(task.getId(), transitionName, variables);  
if (transition != null) {  
  executionImpl.take(transition);  
}  
 

 

 

 

 

 

分享到:
评论

相关推荐

    jbpm-4.4.zip part03

    【jbpm-4.4.zip part03】这个压缩文件是关于jbpm 4.4版本的组成部分,jbpm(Java Business Process Management)是一个开源的工作流管理系统,它提供了业务流程建模、部署、执行和监控的功能。jbpm 4.4是该系统的一...

    jBPM4.4.rar_jbpm4.4_jbpm4.4 PDF

    《jBPM4.4开发指南》与《jBPM4.4中文用户手册》是深入理解jBPM4.4这一开源工作流管理系统的重要参考资料。jBPM,全称Java Business Process Management,是一个用于执行业务流程的轻量级、灵活的开源框架,它为业务...

    jBPM4.4Pssh.rar_jbpm-4.4_ssh jbpm_工作流OA

    在本压缩包 "jBPM4.4Pssh.rar" 中,重点是将 jbPM 4.4 与 SSH(Struts、Spring 和 Hibernate)框架整合的示例。SSH 是 Java Web 开发中常见的三大框架,它们分别负责视图层、业务层和数据持久层的管理。 Struts 是...

    jbpm4.4的安装myeclipse配置还有helloworld实例

    - 浏览并选择文件路径 `D:\jbpm-4.4\install\src\gpd\jbpm-gpd-site.zip`。 - 点击 “Next”,完成安装后重启 MyEclipse。 #### 三、HelloWorld 示例 本节将详细介绍如何创建一个简单的 jBPM HelloWorld 示例。 ...

    jbpm4.4表字段说明

    JBPM4.4是JBoss Business Process Management (BPM)平台的一个特定版本,它提供了用于设计、执行和管理业务流程的工具和框架。在JBPM4.4中,数据库是存储流程实例、流程定义以及相关元数据的关键部分。以下是关于...

    JBPM4.4例子

    - **环境搭建**: 首先,你需要从JBPM官网下载对应版本的jar包,包括jbpm-runtime、jbpm-gwt-console-server等依赖库,将其添加到项目的类路径中。 - **数据库配置**: JBPM4.4需要一个数据库存储流程实例和相关数据,...

    jbpm-4.4\jbpm-4.4\doc\javadocs

    jbpm-4.4\jbpm-4.4\doc\javadocsjbpm-4.4\jbpm-4.4\doc\javadocsjbpm-4.4\jbpm-4.4\doc\javadocs

    jbpm4.4下载地址

    jBPM 4.4的下载地址为:http://sourceforge.net/projects/jbpm/files/jBPM%204/jbpm-4.4/。在下载页面上,你可以找到不同的包,包括源代码、二进制文件和文档。选择适合你需求的包进行下载。安装过程通常涉及解压缩...

    jbpm4.4帮助文档API--chm格式

    完美版JBPM4.4帮助文档,开发必备。

    JBPM4.4会签实例

    在JBPM4.4版本中,它提供了一个强大的平台来设计、部署和执行复杂的业务流程,其中包括了会签功能。会签,也称为并发审批,是指在业务流程中,需要多个审批人同时或按顺序对同一任务进行审批的场景。本实例通过...

    jbpm4.4文档+学习资料

    5. 集成能力:jbpm4.4可以与Java EE、Spring、Hibernate等框架无缝集成,便于开发企业级应用。 三、jbpm4.4学习路径 1. 基础概念:首先需要了解BPM的基本概念,如流程实例、任务、事件、信号等。 2. 工具使用:学习...

    jBPM4.4开发实例

    在这个入门开发实例中,我们将探讨如何利用jBPM4.4进行业务流程的建模、部署和执行。 **一、jBPM4.4核心概念** 1. **流程定义(Process Definition)**:使用jBPM的流程定义语言(BPML或BPMN)来描述业务流程。...

    jbpm4.4中文开发指南

    6. **规则集成**: jbpm4.4可以与Drools规则引擎结合,实现业务规则在流程执行过程中的动态应用,提升决策的灵活性。 7. **监控和报表**: 提供了监控工具,允许管理员查看流程实例的状态、跟踪任务执行情况,并生成...

    JBPM4.4工作流引擎实例demo

    - **业务规则集成**: 可以与Drools规则引擎无缝集成,实现业务规则的动态执行。 ### 3. jbpmDemo实例分析 jbpmDemo实例展示了如何使用jBPM4.4进行流程实例的创建、执行和管理。可能包含以下内容: - **流程定义...

    JBPM4.4资料的其他补充

    5. **规则集成**:通过与Drools(一个规则引擎)的集成,JBPM4.4允许在流程中嵌入决策逻辑,使得流程可以根据业务规则自动执行不同的路径。 6. **监控和报表**:JBPM4.4提供了监控工具,可以跟踪流程实例的执行状态...

    jBPM4.4 详解 API 中文

    3. **运行交互功能**:实现工作流管理系统与用户、外部应用程序的交互,增强流程的动态适应性。 采用工作流管理系统的优点显著,包括但不限于提升系统柔性以应对业务流程变化、加强业务过程控制、优化客户服务体验...

    JBPM4.4所需要的包.rar

    标题中的"JBPM4.4所需要的包.rar"表明这是一个与JBPM 4.4版本相关的压缩文件,包含了一些必要的库和组件。JBPM(Java Business Process Management)是一个开源的工作流和业务流程管理系统,用于设计、执行和管理...

Global site tag (gtag.js) - Google Analytics