public void init(SynapseEnvironment synapseEnvironment) { this.synapseEnv = synapseEnvironment; if (endpoint != null) { endpoint.init(synapseEnvironment); } if (blocking) { try { configCtx = ConfigurationContextFactory.createConfigurationContextFromFileSystem( DEFAULT_CLIENT_REPO, DEFAULT_AXIS2_XML); blockingMsgSender = new BlockingMsgSender(); blockingMsgSender.setConfigurationContext(configCtx); blockingMsgSender.init(); } catch (AxisFault axisFault) { String msg = "Error while initializing the Call mediator"; log.error(msg, axisFault); throw new SynapseException(msg, axisFault); } } else { synapseEnvironment.updateCallMediatorCount(true); } }
/** * Send request in blocking manner * * @param synInCtx message context * @return continue the mediation flow or not */ private boolean handleBlockingCall(MessageContext synInCtx) { SynapseLog synLog = getLog(synInCtx); if (synLog.isTraceOrDebugEnabled()) { synLog.traceOrDebug("Start : Call mediator - Blocking Call"); if (synLog.isTraceTraceEnabled()) { synLog.traceTrace("Message : " + synInCtx.getEnvelope()); } } MessageContext resultMsgCtx = null; try { if ("true".equals(synInCtx.getProperty(SynapseConstants.OUT_ONLY))) { blockingMsgSender.send(endpoint, synInCtx); } else { resultMsgCtx = blockingMsgSender.send(endpoint, synInCtx); if ("true".equals(resultMsgCtx.getProperty(SynapseConstants.BLOCKING_SENDER_ERROR))) { handleFault( synInCtx, (Exception) resultMsgCtx.getProperty(SynapseConstants.ERROR_EXCEPTION)); } } } catch (Exception ex) { handleFault(synInCtx, ex); } if (resultMsgCtx != null) { if (synLog.isTraceTraceEnabled()) { synLog.traceTrace("Response payload received : " + resultMsgCtx.getEnvelope()); } try { synInCtx.setEnvelope(resultMsgCtx.getEnvelope()); if (synLog.isTraceOrDebugEnabled()) { synLog.traceOrDebug("End : Call mediator - Blocking Call"); } return true; } catch (Exception e) { handleFault(synInCtx, e); } } else { if (synLog.isTraceOrDebugEnabled()) { synLog.traceOrDebug("Service returned a null response"); } } return true; }
public boolean dispatch(MessageContext messageContext) { if (log.isDebugEnabled()) { log.debug( "Sending the message to client with message processor [" + messageProcessor.getName() + "]"); } // The below code is just for keeping the backward compatibility with the old code. if (targetEndpoint == null) { targetEndpoint = (String) messageContext.getProperty(ForwardingProcessorConstants.TARGET_ENDPOINT); } MessageContext outCtx = null; SOAPEnvelope originalEnvelop = messageContext.getEnvelope(); if (targetEndpoint != null) { Endpoint ep = messageContext.getEndpoint(targetEndpoint); try { // Send message to the client while (!isSuccessful && !isTerminated) { try { // For each retry we need to have a fresh copy of the actual message. otherwise retry // may not // work as expected. messageContext.setEnvelope(MessageHelper.cloneSOAPEnvelope(originalEnvelop)); OMElement firstChild = null; // org.apache.axis2.context.MessageContext origAxis2Ctx = ((Axis2MessageContext) messageContext).getAxis2MessageContext(); if (JsonUtil.hasAJsonPayload(origAxis2Ctx)) { firstChild = origAxis2Ctx.getEnvelope().getBody().getFirstElement(); } // Had to do this because MessageHelper#cloneSOAPEnvelope does not clone // OMSourcedElemImpl correctly. if (JsonUtil.hasAJsonPayload(firstChild)) { // OMElement clonedFirstElement = messageContext.getEnvelope().getBody().getFirstElement(); if (clonedFirstElement != null) { clonedFirstElement.detach(); messageContext.getEnvelope().getBody().addChild(firstChild); } } // Had to do this because MessageHelper#cloneSOAPEnvelope does not clone // OMSourcedElemImpl correctly. origAxis2Ctx.setProperty( HTTPConstants.NON_ERROR_HTTP_STATUS_CODES, getNonRetryStatusCodes()); outCtx = sender.send(ep, messageContext); isSuccessful = true; } catch (Exception e) { // this means send has failed due to some reason so we have to retry it if (e instanceof SynapseException) { isSuccessful = isNonRetryErrorCode(e.getCause().getMessage()); } if (!isSuccessful) { log.error( "BlockingMessageSender of message processor [" + this.messageProcessor.getName() + "] failed to send message to the endpoint"); } } if (isSuccessful) { if (outCtx != null) { if ("true" .equals(outCtx.getProperty(ForwardingProcessorConstants.BLOCKING_SENDER_ERROR))) { // this means send has failed due to some reason so we have to retry it isSuccessful = isNonRetryErrorCode( (String) outCtx.getProperty(SynapseConstants.ERROR_MESSAGE)); if (isSuccessful) { sendThroughReplySeq(outCtx); } else { // This means some error has occurred so must try to send down the fault sequence. log.error( "BlockingMessageSender of message processor [" + this.messageProcessor.getName() + "] failed to send message to the endpoint"); sendThroughFaultSeq(outCtx); } } else { // Send the message down the reply sequence if there is one sendThroughReplySeq(outCtx); messageConsumer.ack(); attemptCount = 0; isSuccessful = true; if (log.isDebugEnabled()) { log.debug( "Successfully sent the message to endpoint [" + ep.getName() + "]" + " with message processor [" + messageProcessor.getName() + "]"); } } } else { // This Means we have invoked an out only operation // remove the message and reset the count messageConsumer.ack(); attemptCount = 0; isSuccessful = true; if (log.isDebugEnabled()) { log.debug( "Successfully sent the message to endpoint [" + ep.getName() + "]" + " with message processor [" + messageProcessor.getName() + "]"); } } } if (!isSuccessful) { // Then we have to retry sending the message to the client. prepareToRetry(); } else { if (messageProcessor.isPaused()) { this.messageProcessor.resumeService(); log.info( "Resuming the service of message processor [" + messageProcessor.getName() + "]"); } } } } catch (Exception e) { log.error( "Message processor [" + messageProcessor.getName() + "] failed to send the message to" + " client", e); } } else { // No Target Endpoint defined for the Message // So we do not have a place to deliver. // Here we log a warning and remove the message // todo: we can improve this by implementing a target inferring mechanism log.warn( "Property " + ForwardingProcessorConstants.TARGET_ENDPOINT + " not found in the message context , Hence removing the message "); messageConsumer.ack(); } return true; }