大佬们的项目里有用到会签,所以趁双休日研究了下。

  其实也是简单的会签情况,不过开始的时候研究了4.4,(因为先前研究的都是4.4),发现4.4跟4.3的处理方法完全不一样,搞的我比较郁闷……弄了一天,都是一个老问题,就是在历史记录表中查不到记录。后来查了很多资料,才觉悟4.4的处理方式确实不同于4.3。

  4.3中的实现还是很简单的。实例中使用custom节点。

  例子是前几次实例中的请假,就很简单的申请——manager和boss进行会签——同意则继续,不同意返回。

下面是主要的类及说明:

package com.ht.util;  

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import org.jbpm.api.Configuration;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.TaskService;
import org.jbpm.api.activity.ActivityExecution;
import org.jbpm.api.activity.ExternalActivityBehaviour;
import org.jbpm.api.task.Task;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.history.HistoryEvent;
import org.jbpm.pvm.internal.history.events.TaskActivityStart;
import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.model.Transition;
import org.jbpm.pvm.internal.session.DbSession;
import org.jbpm.pvm.internal.task.TaskImpl; /**
*
* @author tommy
* 会签类
*/
public class Huiqian implements ExternalActivityBehaviour { private static final long serialVersionUID = 1L;
private static int count = 0;// 同意人数 public void signal(ActivityExecution activityExecution, String signalName,
Map<String, ?> parms) throws Exception {
ExecutionImpl executionImpl = (ExecutionImpl) activityExecution; // 获得流程实例
ProcessInstance pi = (ProcessInstance) executionImpl
.getProcessInstance(); // 获得任务服务
TaskService taskService = Configuration.getProcessEngine()
.getTaskService();
// 获得活动节点
Activity activity = executionImpl.getActivity();
List<Task> tasks = taskService.createTaskQuery().processInstanceId(
pi.getId()).list();
TaskImpl parentTask =(TaskImpl)tasks.get(0); // 获得子任务
List<Task> subTask_list = taskService.getSubTasks(tasks.get(0).getId());
Iterator<Task> iter = subTask_list.iterator();
// 循环所有子任务
while (iter.hasNext()) { Task subtask = iter.next();
System.out.println(subtask.getId());
if (parms.get("name").equals(subtask.getAssignee())) {
if (parms.get("RESULT").equals("同意")) {
count++;
}
taskService.completeTask(subtask.getId()); // 完成当前会签人子任务
}
} // 剩余子任务数量为1个时,则直接跳转下一个流程节点
if (subTask_list == null || subTask_list.size() == 1) {
Transition transition = null;
if ((signalName == null)
|| ((Task.STATE_COMPLETED.equals(signalName))
&& (activity.getOutgoingTransitions() != null) && (activity
.getOutgoingTransitions().size() == 1))) {
transition = activity.getOutgoingTransitions().get(0); // 获得将跳转到的transition
} else {
transition = activity.findOutgoingTransition(signalName);
}
Map<String, Object> map = new HashMap<String, Object>();
if (count == 2) {
count = 0;
map.put("RESULT", "PASS"); } else {
count = 0;
map.put("RESULT", "NOPASS");
// System.out.print("会签不通过");
}
taskService.completeTask(tasks.get(0).getId(), map); // 结束父任务
executionImpl.take(transition); // 流程继续 } else {
executionImpl.waitForSignal();
} } public void execute(ActivityExecution activityExecution) throws Exception {
ExecutionImpl executionimpl = (ExecutionImpl) activityExecution;
DbSession dbsession = EnvironmentImpl.getFromCurrent(DbSession.class);
TaskImpl taskimpl = dbsession.createTask();
taskimpl.setName("领导会签");
taskimpl.setExecution(executionimpl);
taskimpl.setProcessInstance(executionimpl.getProcessInstance());
taskimpl.setSignalling(false);
taskimpl.setExecutionDbid(executionimpl.getDbid());
dbsession.save(taskimpl);
HistoryEvent.fire(new TaskActivityStart(taskimpl), executionimpl); // 从原任务中分出两个子任务
//子任务1分配给manager
TaskImpl subtask1 = taskimpl.createSubTask();
subtask1.setAssignee("manager");
subtask1.setName("领导会签,操作角色:" + "manager");
subtask1.setSignalling(false);
subtask1.setExecution(executionimpl);
subtask1.setExecutionDbid(executionimpl.getDbid());
dbsession.save(subtask1);
HistoryEvent.fire(new TaskActivityStart(subtask1), executionimpl); //子任务2分配给boss
TaskImpl subtask2 = taskimpl.createSubTask();
subtask2.setAssignee("boss");
subtask2.setName("领导会签,操作角色:" + "boss");
subtask2.setSignalling(false);
subtask2.setExecution(executionimpl);
subtask2.setExecutionDbid(executionimpl.getDbid());
dbsession.save(subtask2);
HistoryEvent.fire(new TaskActivityStart(subtask2), executionimpl); // 流程等待
executionimpl.waitForSignal();
}
}

  在到custom节点时,执行execute方法,在execute方法中主要是生成2个子节点,并保存进入库表,并且让流程进入等待状态。在每次到达该节点时,就会执行signal方法,进行会签的判断,判断结果根据需要进行一定的处理,当完成自己所需要业务以后可以executionImpl.take(transition),来确定需要跳转的下一个节点。

  也没什么特别复杂的地方,建议使用debug来调试,就会了解整个会签过程了。

本文转自:http://hellotommy.iteye.com/blog/996266

jBPM4.3+ssh+会签 整合配置及完整实例的更多相关文章

  1. JBPM4.4+SSH 整合配置及完整实例

    整合jBPM4.4+ssh过程(spring接管struts2和hibernate,例中都整合在application.xml中,没有单独的jbpm.hibernate.cfg.xml): 1.在se ...

  2. Spring+Hibernate整合配置 --- 比较完整的spring、hibernate 配置

    Spring+Hibernate整合配置 分类: J2EE2010-11-25 17:21 16667人阅读 评论(1) 收藏 举报 springhibernateclassactionservlet ...

  3. SSH框架整合配置所需JAR包(SSH整合)

    转载于:http://www.cnblogs.com/kaige123/p/5719662.html Hibernate Jar: 1.hibernate3.jar,这个是hibernate3.0的核 ...

  4. jbpm4.4+ssh配置(有些使用经验很好)

    http://www.cnblogs.com/cmzcheng/archive/2011/11/20/2255806.html ———————————————————————————————————— ...

  5. springmvc 项目完整示例05 日志 --log4j整合 配置 log4j属性设置 log4j 配置文件 log4j应用

    log4j 就是log for java嘛,老外都喜欢这样子,比如那个I18n  ---internationalization  不就是i和n之间有18个字母... http://logging.a ...

  6. SSH项目整合教学Eclipse搭建SSH(Struts2+Spring3+Hibernate3)

    这篇博文的目的 尝试搭建一个完整的SSH框架项目. 给以后的自己,也给别人一个参考. 读博文前应该注意: 本文提纲:本文通过一个用户注册的实例讲解SSH的整合.创建Struts项目,整合Hiberna ...

  7. 从零打造在线网盘系统之SSH框架整合

    欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...

  8. 【转】SSH中 整合spring和proxool 连接池

    [摘要:比来做的一个项目中应用到了毗邻池技巧,大概我们人人比拟认识的开源毗邻池有dbcp,c3p0,proxool.对那三种毗邻池来讲,从机能战失足率来讲,proxool轻微比前两种好些.本日我首要简 ...

  9. SSH框架整合

    SSH框架整合 一.原理图 action:(struts2) 1.获取表单的数据 2.表单的验证,例如非空验证,email验证等 3.调用service,并把数据传递给service Service: ...

随机推荐

  1. 【OpenStack】OpenStack系列1之Python虚拟环境搭建

    安装virtualenv相关软件包 安装:yum install python-virtualenv* -y 简介,安装包主要包括, python-virtualenv:virtualenv用于创建独 ...

  2. 在Java中>、>>、>>>三者的区别

    Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力 ...

  3. C++使用throw抛出异常

    引用:    c++ 使用throw抛出异常 抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常.该语句的格式为:throw 表达式; ...

  4. PeopleEditor允许客户端输入的同时验证输入的内容

    如何判断PeopleEditor的值为空   在sharepoint开发中,我们经常会用到PeopleEditor这一控件,最近我在写程序的时候用到了,开始的时候不知道怎么用,后来问题解决啦,现在写出 ...

  5. 使用Webdriver执行JS小结

    首先,我们使用如下方式初始化driver: WebDriver driver = new FirefoxDriver(); JavascriptExecutor jse = (JavascriptEx ...

  6. 43. 动态规划求解n个骰子的点数和出现概率(或次数)[Print sum S probability of N dices]

    [题目] 把N个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入N,打印出S的所有可能的值出现的概率. [分析] 典型的动态规划题目. 设n个骰子的和为s出现的次数记为f(n,s),其中n=[1-N ...

  7. iOS tableView 选中某个cell时 标准的处理方法

    以前选中cell时,常常判断选中的行数,但是当cell的顺序发生变化时,就要改动处理函数,特别是行数比较多的时候,很麻烦. 之后运用cell的title的内容判断,但是这种判断与现实的内容密切相关,如 ...

  8. Linux系统排查3——I/O篇

    当磁盘无法写入的时候,一般有以下可能: 文件系统只读 磁盘已满 I节点使用完 一. 遇到只读的文件系统 文件系统自动设置成只读可能是系统自我保护的一种机制,因此需要实现弄清究竟是什么原因造成了文件系统 ...

  9. DP:Coins(POJ 1742)

      用硬币换钱 题目大意:就是有面值为A1,A2,A3....的硬币,各有C1,C2,C3...的数量,问在钱数为m的范围内,能换多少钱?(不找零) 这题看名字就知道是完全背包,但是这题又有点不一样, ...

  10. windows8输入法终极完美修复

    现在WIN8正式版出现以来,win8的用户越来越多,毕竟是新系统,BUG肯定是有的,现在小编就为大家解决一个大BUG. 输入法BUG: 现象:1.删除系统输入法,重启后无法调出输入法; 2.卸载用户安 ...