jBPM4实战系列(二)jBPM4.3+ssh+会签 整合配置及完整实例
??????大佬们的项目里有用到会签,所以趁双休日研究了下。
????? 其实也是简单的会签情况,不过开始的时候研究了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分配给managerTaskImpl 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分配给bossTaskImpl 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来调试,就会了解整个会签过程了。
?????? 下面分享下源码,由于大小限制,没有jar包
?????? 这次的实例比前2次清爽很多……不过还是有点乱,凑合下吧,主要是了解下整个流程
?????? myeclipse8.5+jdk1.6+jbpm4.4+spring3.0.3+struts2.2.1+jbpm4.3+sql server 2000下测试通过.
?????? 