jbpm4.4:会签的实现

本文详细阐述了在JBPM4.4中实现多人会签功能时,如何解决子任务无法获取父任务绑定变量的问题,并提供了解决方案,包括特殊赋值方式和任务回退及选择下一步功能的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直在研究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.  提交子任务的时候,我们首先要通过父任务获得所有的子任务,然后提交完成

对应的子任务,当完成所有的子任务之后再提交父任务,这样,流程才能继续往下流转。    希望对各位有帮助!







评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值