Melih Cetin [http://community.jboss.org/people/mscetin] created the discussion
"Re: ReceiveTaskHandler handling multiple process intances with the same message-id" To view the discussion, visit: http://community.jboss.org/message/627690#627690 -------------------------------------------------------------- Original implementation did not work as expected after server re-start. This is a an improved version in case someone else finds it useful. I still would like someone from jBPM team to provide some remarks about this implementation package com.mycomp.bpm.handler; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; import org.drools.runtime.KnowledgeRuntime; import org.drools.runtime.process.NodeInstance; import org.drools.runtime.process.ProcessInstance; import org.drools.runtime.process.WorkItem; import org.drools.runtime.process.WorkItemHandler; import org.drools.runtime.process.WorkItemManager; import org.drools.runtime.process.WorkflowProcessInstance; import org.jbpm.workflow.instance.node.CompositeContextNodeInstance; import org.jbpm.workflow.instance.node.WorkItemNodeInstance; public class ReceiveTaskHandler implements WorkItemHandler { private static Logger logger = Logger.getLogger(ReceiveTaskHandler.class.getName()); private Map<String, Long> waiting = new HashMap<String, Long>(); private KnowledgeRuntime ksession; public ReceiveTaskHandler(KnowledgeRuntime ksession) { this.ksession = ksession; } public void setKnowledgeRuntime(KnowledgeRuntime ksession) { this.ksession = ksession; } private String constructKey(long processInstanceId, String messageId) { return processInstanceId + "|" + messageId; } @Override public void executeWorkItem(WorkItem workItem, WorkItemManager manager) { long processInstanceId = workItem.getProcessInstanceId(); String messageId = (String) workItem.getParameter("MessageId"); waiting.put(constructKey(processInstanceId, messageId), workItem.getId()); // If waiting map previously contained a mapping for messageId, the old value is replaced !!! } public void messageReceived(String messageId, Object message) { throw new UnsupportedOperationException("messageReceived(String messageId, Object message) method is not supported. " + "Instead use messageReceived(long, String, Object) method" ); } private Long findWorkItemId(NodeInstance prmNodeInstance, String prmMessageId) { Long workItemId = null; if (prmNodeInstance instanceof WorkItemNodeInstance) { WorkItemNodeInstance workItemNode = (WorkItemNodeInstance)prmNodeInstance; WorkItem workItem = workItemNode.getWorkItem(); if (workItem.getName().equals("Receive Task") && workItem.getParameter("MessageId").equals(prmMessageId)) { workItemId = workItem.getId(); } } if (prmNodeInstance instanceof CompositeContextNodeInstance) { for (NodeInstance ni : ((CompositeContextNodeInstance)prmNodeInstance).getNodeInstances(false)) { workItemId = findWorkItemId(ni, prmMessageId); if (workItemId != null) { break; } } } return workItemId; } public void messageReceived(long processInstanceId, String messageId, Object message) { Long workItemId = waiting.get(constructKey(processInstanceId, messageId)); if (workItemId == null) { // See if this is a work item persisted pefore the re-start of the server ProcessInstance pi = ksession.getProcessInstance(processInstanceId); final WorkflowProcessInstance workflowProcessInstance = ((WorkflowProcessInstance) pi); for (NodeInstance nodeInstance : workflowProcessInstance.getNodeInstances()) { workItemId = findWorkItemId(nodeInstance, messageId); if (workItemId != null) { break; } } } if (workItemId != null) { Map<String, Object> results = new HashMap<String, Object>(); results.put("Message", message); ksession.getWorkItemManager().completeWorkItem(workItemId, results); } else { logger.error("No workItem found for receiveTask of process with id:" + processInstanceId); } } @Override public void abortWorkItem(WorkItem workItem, WorkItemManager manager) { long processInstanceId = workItem.getProcessInstanceId(); String messageId = (String) workItem.getParameter("MessageId"); waiting.remove(constructKey(processInstanceId, messageId)); } } -------------------------------------------------------------- Reply to this message by going to Community [http://community.jboss.org/message/627690#627690] Start a new discussion in jBPM at Community [http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2034]
_______________________________________________ jboss-user mailing list [email protected] https://lists.jboss.org/mailman/listinfo/jboss-user
