獲取Activiti所有用戶任務
阿新 • • 發佈:2017-08-14
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所有用戶任務