1. 程式人生 > >獲取Activiti所有用戶任務

獲取Activiti所有用戶任務

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所有用戶任務