获取Activiti所有用户任务
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取Activiti所有用户任务相关的知识,希望对你有一定的参考价值。
最近接到一个用户需求:
要求在流程部署完成后可通过手动配置各用户任务的处理候选组,来控制流程走向。
解决此需求要解决以下问题:
1,流程部署完成后,尚未有流程实例,如何获取所有用户任务?
2,设置完各节点的处理候选组后,如何动态分配?
第二个问题好解决,通过设置任务监听器,来获取当前的用户任务KEY,从配置表中获取处理组进行设置。
下面来解决第一个问题,代码如下:
@Override public List<ProcessTaskVO> findProcessUserTaskByPdId(String processDefinitionId){ List<ProcessTaskVO> processTasks = new ArrayList<ProcessTaskVO>(); if(StringUtils.isEmpty(processDefinitionId)){ return processTasks; } ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult(); if(pd == null){ return processTasks; }else{ return findProcessUserTaskByPd(pd); } } private List<ProcessTaskVO> findProcessUserTaskByPd(ProcessDefinition pd){ List<ProcessTaskVO> processTasks = new ArrayList<ProcessTaskVO>(); ProcessTaskVO processTask = null; String resName = pd.getResourceName(); InputStream resouceStream =repositoryService.getResourceAsStream(pd.getDeploymentId(), resName); XMLInputFactory xif = XMLInputFactory.newInstance(); InputStreamReader in; XMLStreamReader xtr; try { in = new InputStreamReader(resouceStream, "UTF-8"); xtr = xif.createXMLStreamReader(in); BpmnModel model = new BpmnXMLConverter().convertToBpmnModel(xtr); Collection<FlowElement> flowElements = model.getMainProcess().getFlowElements(); for(FlowElement e : flowElements) { String clazz = e.getClass().toString(); if(clazz.endsWith("UserTask")){ processTask = new ProcessTaskVO(); processTask.setTaskKey(e.getId()); processTask.setTaskName(e.getName()); processTasks.add(processTask); } } } catch (XMLStreamException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return processTasks; }
编码过程中的问题:
在使用任务监听器过程中,发现监听器中无法自动注入自己service,解决方法:
1,确保包扫描能够扫描到任务监听器
<!-- 扫描所有监听 --> <context:component-scan base-package="com.xxxx.**.listener" />
2,配置任务监听器
其中${applyTaskListener},为任务监听器的bean名称
3,任务监听器写法:
@Service("applyTaskListener") public class ApplyTaskListener implements TaskListener{ /** * */ private static final long serialVersionUID = -7394227383264070902L; /** * 用户查询流程用户任务的处理组的service */ @Autowired private IProcessTaskRoleService processTaskRoleService; @Override public void notify(DelegateTask delegateTask) { String taskKey = delegateTask.getTaskDefinitionKey(); String processDefinitionId = delegateTask.getProcessDefinitionId(); /** * 此变量含有流程发起人信息 */ Map<String,Object> variables = delegateTask.getVariables(); ProcessTaskRoleVO processTaskRole = processTaskRoleService.findByTaskKeyAndPdId(taskKey, processDefinitionId); //如未进行配置则处理人为流程发起人 if(processTaskRole == null){ delegateTask.setAssignee(variables.get("流程发起人在变量MAP中的key").toString()); }else{ RoleVO role = processTaskRole.getRole(); if(role == null){ //如配置的角色不存在则处理人为流程发起人 delegateTask.setAssignee(variables.get("流程发起人在变量MAP中的key").toString()); }else{ delegateTask.addCandidateGroup(role.getId().toString()); } } } }
本文出自 “蓝色幽默” 博客,请务必保留此出处http://bluehumor.blog.51cto.com/2148378/1956007
以上是关于获取Activiti所有用户任务的主要内容,如果未能解决你的问题,请参考以下文章