private CorrelationKeySet computeCorrelationKeys(MyRoleMessageExchangeImpl mex) { CorrelationKeySet keySet = new CorrelationKeySet(); Operation operation = mex.getOperation(); Element msg = mex.getRequest().getMessage(); javax.wsdl.Message msgDescription = operation.getInput().getMessage(); Set<OScope.CorrelationSet> csets = _plinkDef.getNonInitiatingCorrelationSetsForOperation(operation); for (OScope.CorrelationSet cset : csets) { CorrelationKey key = computeCorrelationKey( cset, _process.getOProcess().messageTypes.get(msgDescription.getQName()), msg); keySet.add(key); } csets = _plinkDef.getJoinningCorrelationSetsForOperation(operation); for (OScope.CorrelationSet cset : csets) { CorrelationKey key = computeCorrelationKey( cset, _process.getOProcess().messageTypes.get(msgDescription.getQName()), msg); keySet.add(key); } // Let's creata a key based on the sessionId String mySessionId = mex.getProperty(MessageExchange.PROPERTY_SEP_MYROLE_SESSIONID); if (mySessionId != null) keySet.add(new CorrelationKey("-1", new String[] {mySessionId})); return keySet; }
boolean processInterceptor( MessageExchangeInterceptor i, MyRoleMessageExchangeImpl mex, InterceptorContext ictx, InterceptorInvoker invoker) { __log.debug(invoker + "--> interceptor " + i); try { invoker.invoke(i, mex, ictx); } catch (FaultMessageExchangeException fme) { __log.debug( "interceptor " + i + " caused invoke on " + this + " to be aborted with FAULT " + fme.getFaultName()); mex.setFault(fme.getFaultName(), fme.getFaultData()); return false; } catch (AbortMessageExchangeException ame) { __log.debug( "interceptor " + i + " cause invoke on " + this + " to be aborted with FAILURE: " + ame.getMessage()); mex.setFailure( MessageExchange.FailureType.ABORTED, __msgs.msgInterceptorAborted(mex.getMessageExchangeId(), i.toString(), ame.getMessage()), null); return false; } return true; }
private void setMexRole(MyRoleMessageExchangeImpl mex) { Operation operation = getMyRoleOperation(mex.getOperationName()); mex.getDAO().setPartnerLinkModelId(_plinkDef.getId()); mex.setPortOp(_plinkDef.myRolePortType, operation); mex.setPattern( operation.getOutput() == null ? MessageExchange.MessageExchangePattern.REQUEST_ONLY : MessageExchange.MessageExchangePattern.REQUEST_RESPONSE); }
public void invokeNewInstance(MyRoleMessageExchangeImpl mex, RoutingInfo routing) { Operation operation = getMyRoleOperation(mex.getOperationName()); if (__log.isDebugEnabled()) { __log.debug( "INPUTMSG: " + routing.correlator.getCorrelatorId() + ": routing failed, CREATING NEW INSTANCE"); } ProcessDAO processDAO = _process.getProcessDAO(); if (_process._pconf.getState() == ProcessState.RETIRED) { throw new InvalidProcessException( "Process is retired.", InvalidProcessException.RETIRED_CAUSE_CODE); } if (!_process.processInterceptors(mex, InterceptorInvoker.__onNewInstanceInvoked)) { __log.debug("Not creating a new instance for mex " + mex + "; interceptor prevented!"); throw new InvalidProcessException( "Cannot instantiate process '" + _process.getPID() + "' any more.", InvalidProcessException.TOO_MANY_INSTANCES_CAUSE_CODE); } ProcessInstanceDAO newInstance = processDAO.createInstance(routing.correlator); BpelRuntimeContextImpl instance = _process.createRuntimeContext(newInstance, new PROCESS(_process.getOProcess()), mex); // send process instance event NewProcessInstanceEvent evt = new NewProcessInstanceEvent( new QName(_process.getOProcess().targetNamespace, _process.getOProcess().getName()), _process.getProcessDAO().getProcessId(), newInstance.getInstanceId()); evt.setPortType(mex.getPortType().getQName()); evt.setOperation(operation.getName()); evt.setMexId(mex.getMessageExchangeId()); _process._debugger.onEvent(evt); _process.saveEvent(evt, newInstance); mex.setCorrelationStatus(MyRoleMessageExchange.CorrelationStatus.CREATE_INSTANCE); mex.getDAO().setInstance(newInstance); if (mex.getDAO().getCreateTime() == null) mex.getDAO().setCreateTime(instance.getCurrentEventDateTime()); _process._engine.acquireInstanceLock(newInstance.getInstanceId()); instance.execute(); }
public void invokeInstance(MyRoleMessageExchangeImpl mex, RoutingInfo routing) { Operation operation = getMyRoleOperation(mex.getOperationName()); if (__log.isDebugEnabled()) { __log.debug( "INPUTMSG: " + routing.correlator.getCorrelatorId() + ": ROUTING to existing instance " + routing.messageRoute.getTargetInstance().getInstanceId()); } ProcessInstanceDAO instanceDao = routing.messageRoute.getTargetInstance(); BpelProcess process2 = _process._engine._activeProcesses.get(instanceDao.getProcess().getProcessId()); // Reload process instance for DAO. BpelRuntimeContextImpl instance = process2.createRuntimeContext(instanceDao, null, null); instance.inputMsgMatch(routing.messageRoute.getGroupId(), routing.messageRoute.getIndex(), mex); // Kill the route so some new message does not get routed to // same process instance. routing.correlator.removeRoutes(routing.messageRoute.getGroupId(), instanceDao); // send process instance event CorrelationMatchEvent evt = new CorrelationMatchEvent( new QName(process2.getOProcess().targetNamespace, process2.getOProcess().getName()), process2.getProcessDAO().getProcessId(), instanceDao.getInstanceId(), routing.matchedKeySet); evt.setPortType(mex.getPortType().getQName()); evt.setOperation(operation.getName()); evt.setMexId(mex.getMessageExchangeId()); process2._debugger.onEvent(evt); // store event process2.saveEvent(evt, instanceDao); mex.setCorrelationStatus(MyRoleMessageExchange.CorrelationStatus.MATCHED); mex.getDAO().setInstance(routing.messageRoute.getTargetInstance()); if (mex.getDAO().getCreateTime() == null) mex.getDAO().setCreateTime(instance.getCurrentEventDateTime()); instance.execute(); }
public void noRoutingMatch(MyRoleMessageExchangeImpl mex, List<RoutingInfo> routings) { if (!mex.isAsynchronous()) { mex.setFailure( MessageExchange.FailureType.NOMATCH, "No process instance matching correlation keys.", null); } else { // enqueue message with the last message route, as per the comments in caller (@see // BpelProcess.invokeProcess()) RoutingInfo routing = (routings != null && routings.size() > 0) ? routings.get(routings.size() - 1) : null; if (routing != null) { if (__log.isDebugEnabled()) { __log.debug( "INPUTMSG: " + routing.correlator.getCorrelatorId() + ": SAVING to DB (no match) "); } // send event CorrelationNoMatchEvent evt = new CorrelationNoMatchEvent( mex.getPortType().getQName(), mex.getOperation().getName(), mex.getMessageExchangeId(), routing.wholeKeySet); evt.setProcessId(_process.getProcessDAO().getProcessId()); evt.setProcessName( new QName(_process.getOProcess().targetNamespace, _process.getOProcess().getName())); _process._debugger.onEvent(evt); mex.setCorrelationStatus(MyRoleMessageExchange.CorrelationStatus.QUEUED); // No match, means we add message exchange to the queue. routing.correlator.enqueueMessage(mex.getDAO(), routing.wholeKeySet); } } }
public List<RoutingInfo> findRoute(MyRoleMessageExchangeImpl mex) { List<RoutingInfo> routingInfos = new ArrayList<RoutingInfo>(); if (__log.isTraceEnabled()) { __log.trace( ObjectPrinter.stringifyMethodEnter( this + ":inputMsgRcvd", new Object[] {"messageExchange", mex})); } Operation operation = getMyRoleOperation(mex.getOperationName()); if (operation == null) { __log.error( __msgs.msgUnknownOperation(mex.getOperationName(), _plinkDef.myRolePortType.getQName())); mex.setFailure(MessageExchange.FailureType.UNKNOWN_OPERATION, mex.getOperationName(), null); return null; } setMexRole(mex); // now, the tricks begin: when a message arrives we have to see if there // is anyone waiting for it. Get the correlator, a persisted communication-reduction // data structure supporting correlation correlationKey matching! String correlatorId = BpelProcess.genCorrelatorId(_plinkDef, operation.getName()); CorrelatorDAO correlator = _process.getProcessDAO().getCorrelator(correlatorId); CorrelationKeySet keySet; // We need to compute the correlation keys (based on the operation // we can infer which correlation keys to compute - this is merely a set // consisting of each correlationKey used in each correlation sets // that is ever referenced in an <receive>/<onMessage> on this // partnerlink/operation. try { keySet = computeCorrelationKeys(mex); } catch (InvalidMessageException ime) { // We'd like to do a graceful exit here, no sense in rolling back due to a // a message format problem. __log.debug("Unable to evaluate correlation keys, invalid message format. ", ime); mex.setFailure(MessageExchange.FailureType.FORMAT_ERROR, ime.getMessage(), null); return null; } String mySessionId = mex.getProperty(MessageExchange.PROPERTY_SEP_MYROLE_SESSIONID); String partnerSessionId = mex.getProperty(MessageExchange.PROPERTY_SEP_PARTNERROLE_SESSIONID); if (__log.isDebugEnabled()) { __log.debug( "INPUTMSG: " + correlatorId + ": MSG RCVD keys=" + keySet + " mySessionId=" + mySessionId + " partnerSessionId=" + partnerSessionId); } // Try to find a route for one of our keys. List<MessageRouteDAO> messageRoutes = correlator.findRoute(keySet); if (messageRoutes != null && messageRoutes.size() > 0) { for (MessageRouteDAO messageRoute : messageRoutes) { if (__log.isDebugEnabled()) { __log.debug( "INPUTMSG: " + correlatorId + ": ckeySet " + messageRoute.getCorrelationKeySet() + " route is to " + messageRoute); } routingInfos.add( new RoutingInfo(messageRoute, messageRoute.getCorrelationKeySet(), correlator, keySet)); } } if (routingInfos.size() == 0) { routingInfos.add(new RoutingInfo(null, null, correlator, keySet)); } return routingInfos; }
public boolean isCreateInstance(MyRoleMessageExchangeImpl mex) { Operation operation = getMyRoleOperation(mex.getOperationName()); return _plinkDef.isCreateInstanceOperation(operation); }