最近一直在研究jbpm4.4,在做项目的过程中发现了很多问题,其中的某些问题在网上的资料很多,当然都能够顺利的解决,但是当我实现多人会签功能的时候,花了
很大精力都没有找到很好的解决办法,经过半天时间的编码测试之后最终还是将其解决了,jbpm4.4会签的功能在网上的资料很少,这里我就将我的实现思想阐述出来,
希望对初学者有所帮助。
网上查找资料的实现代码大致如下:
public void assign(Assignable assignable, OpenExecution openExecution)
throws Exception {
String pid = openExecution.getProcessInstance().getId();
Task task = workFlowService.getTaskService().createTaskQuery().processInstanceId(pid)
. activityName(openExecution.getName()).uniqueResult();
createSubTasks(task);
}
public void createSubTasks(Task task) {
// 取得事项定义好的会签角色列表
list = (List<String>) workFlowService.getTaskService().getVariable(task.getId(), "clerk");
// 为每一个角色动态创建子任务
if(list != null) {
for(String participant : list) {
TaskImpl subTask = (TaskImpl) ((OpenTask)task).createSubTask();
subTask.setAssignee(participant);
subTask.setFormResourceName(task.getFormResourceName());
subTask.setName(task.getName());
subTask.setActivityName(task.getActivityName());
workFlowService.getTaskService().addTaskParticipatingUser(task.getId(), participant, Participation.CLIENT);
}
}
但是以上方式会存在一个问题: 子任务得不到父任务上绑定的变量: 举个例子说明一下: 如果现在第一个任务节点为申请人,提交表单的时候绑定了 一个表单form的变量
值,而在这里虽然能动态分配任务,但是在查找我的任务列表的时候,由于取不到form变量的值,而报空指针异常的错误。现在我的解决办法如下:
public class CounterAssignHandler implements AssignmentHandler {
private String roleName;
private static ProcessEngine processEngine;
private static UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
}
@SuppressWarnings("unchecked")
public void assign(Assignable assignable, OpenExecution execution)
throws Exception {
// TODO Auto-generated method stub
TaskService taskService = processEngine.getTaskService();
String pid=execution.getProcessInstance().getId();
Task task=taskService.createTaskQuery().processInstanceId(pid).activityName(execution.getName()).uniqueResult();
Object value=taskService.getVariable(task.getId(), "form"); //获得父任务绑定的变量
Map<String,Object> variables=new HashMap<String, Object>();
variables.put("form", value);
List<String> loginNames=userDao.searchUsersOfRole(roleName);
if(loginNames!=null){
for(String actorId:loginNames){
TaskImpl t = (TaskImpl)task; //此处必须将task强制类型转换为TaskImpl
TaskImpl subTask = t.createSubTask();
subTask.setAssignee(actorId);
subTask.setVariable("form", value); //此处直接将父任务绑定的变量设置到子任务当中
taskService.addTaskParticipatingUser(task.getId(), actorId, Participation.CLIENT);
}
}
}
}
通过这种方式子任务 就可以获得父任务的变量而实现顺利的流转,此处还特别提醒,在做回退和选择下一步功能的时候,如果传递进来的是任务的taskId,
那么这里获得Task对象之后一定要记得判断该Task是否存在父任务,如果存在父任务,说明该任务是子任务,子任务在回退和选择下一步的时候应该是按照
父任务所在的节点来获得经历过的历史任务节点和所有能往下流转的Transition. 提交子任务的时候,我们首先要通过父任务获得所有的子任务,然后提交完成
对应的子任务,当完成所有的子任务之后再提交父任务,这样,流程才能继续往下流转。 希望对各位有帮助!