@Override protected void onInit() { super.onInit(); synchronized (this.initializationMonitor) { if (!this.initialized) { Assert.notEmpty(this.handlers, "handler list must not be empty"); this.configureChain(); this.initialized = true; } } }
protected void produceOutput(Object replyArg, final Message<?> requestMessage) { final MessageHeaders requestHeaders = requestMessage.getHeaders(); Object reply = replyArg; Object replyChannel = null; if (getOutputChannel() == null) { Map<?, ?> routingSlipHeader = requestHeaders.get(IntegrationMessageHeaderAccessor.ROUTING_SLIP, Map.class); if (routingSlipHeader != null) { Assert.isTrue(routingSlipHeader.size() == 1, "The RoutingSlip header value must be a SingletonMap"); Object key = routingSlipHeader.keySet().iterator().next(); Object value = routingSlipHeader.values().iterator().next(); Assert.isInstanceOf(List.class, key, "The RoutingSlip key must be List"); Assert.isInstanceOf(Integer.class, value, "The RoutingSlip value must be Integer"); List<?> routingSlip = (List<?>) key; AtomicInteger routingSlipIndex = new AtomicInteger((Integer) value); replyChannel = getOutputChannelFromRoutingSlip(reply, requestMessage, routingSlip, routingSlipIndex); if (replyChannel != null) { reply = addRoutingSlipHeader(reply, routingSlip, routingSlipIndex); } } if (replyChannel == null) { replyChannel = requestHeaders.getReplyChannel(); if (replyChannel == null && reply instanceof Message) { replyChannel = ((Message<?>) reply).getHeaders().getReplyChannel(); } } } doProduceOutput(requestMessage, requestHeaders, reply, replyChannel); }
private void doProduceOutput(final Message<?> requestMessage, final MessageHeaders requestHeaders, Object reply, Object replyChannel) { if (this.async && (reply instanceof ListenableFuture<?> || reply instanceof Publisher<?>)) { if (reply instanceof ListenableFuture<?> || !(getOutputChannel() instanceof ReactiveStreamsSubscribableChannel)) { asyncNonReactiveReply(requestMessage, requestHeaders, reply, replyChannel); } else { ((ReactiveStreamsSubscribableChannel) getOutputChannel()) .subscribeTo( Flux.from((Publisher<?>) reply) .map(result -> createOutputMessage(result, requestHeaders))); } } else { sendOutput(createOutputMessage(reply, requestHeaders), replyChannel, false); } }
@Override protected void onInit() { super.onInit(); Assert.state(!(this.outputChannelName != null && this.outputChannel != null), //NOSONAR (inconsistent sync) "'outputChannelName' and 'outputChannel' are mutually exclusive."); if (getBeanFactory() != null) { this.messagingTemplate.setBeanFactory(getBeanFactory()); } this.messagingTemplate.setDestinationResolver(getChannelResolver()); }
protected Message<?> createOutputMessage(Object output, MessageHeaders requestHeaders) { AbstractIntegrationMessageBuilder<?> builder = null; if (output instanceof Message<?>) { if (this.noHeadersPropagation || !shouldCopyRequestHeaders()) { return (Message<?>) output; } builder = this.getMessageBuilderFactory().fromMessage((Message<?>) output); } else if (output instanceof AbstractIntegrationMessageBuilder) { builder = (AbstractIntegrationMessageBuilder<?>) output; } else { builder = this.getMessageBuilderFactory().withPayload(output); } if (!this.noHeadersPropagation && shouldCopyRequestHeaders()) { builder.filterAndCopyHeadersIfAbsent(requestHeaders, this.selectiveHeaderPropagation ? this.notPropagatedHeaders : null); } return builder.build(); }
checkReuse(messageProducer); if (channelName != null) { messageProducer.setOutputChannelName(channelName); messageProducer.setOutputChannel(outputChannel);
protected void postProcessReplyProducer(AbstractMessageProducingHandler handler) { if (this.sendTimeout != null) { handler.setSendTimeout(this.sendTimeout); } if (this.requiresReply != null) { if (handler instanceof AbstractReplyProducingMessageHandler) { ((AbstractReplyProducingMessageHandler) handler).setRequiresReply(this.requiresReply); } else { if (this.requiresReply && logger.isDebugEnabled()) { logger.debug("requires-reply can only be set to AbstractReplyProducingMessageHandler " + "or its subclass, " + handler.getComponentName() + " doesn't support it."); } } } }
@Override public void onSuccess(Object result) { Message<?> replyMessage = null; try { replyMessage = createOutputMessage(result, requestHeaders); sendOutput(replyMessage, theReplyChannel, false); } catch (Exception e) { Exception exceptionToLogAndSend = e; if (!(e instanceof MessagingException)) { exceptionToLogAndSend = new MessageHandlingException(requestMessage, e); if (replyMessage != null) { exceptionToLogAndSend = new MessagingException(replyMessage, exceptionToLogAndSend); } } logger.error("Failed to send async reply: " + result.toString(), exceptionToLogAndSend); onFailure(exceptionToLogAndSend); } }
routingSlipPathValue = getBeanFactory().getBean((String) path); return getOutputChannelFromRoutingSlip(reply, requestMessage, routingSlip, routingSlipIndex);
private void checkReuse(AbstractMessageProducingHandler replyHandler) { Assert.isTrue(!referencedReplyProducers.contains(replyHandler), "An AbstractMessageProducingMessageHandler may only be referenced once (" + replyHandler.getComponentName() + ") - use scope=\"prototype\""); referencedReplyProducers.add(replyHandler); this.replyHandler = replyHandler; }
@Bean @Primary @ServiceActivator(inputChannel = Sink.INPUT) public MessageHandler bridgeMessageHandler() { AbstractMessageProducingHandler messageHandler; if (StringUtils.hasText(this.cassandraSinkProperties.getIngestQuery())) { messageHandler = new MessageTransformingHandler( new PayloadToMatrixTransformer(this.cassandraSinkProperties.getIngestQuery())); } else { messageHandler = new BridgeHandler(); } messageHandler.setOutputChannel(toSink()); return messageHandler; }
@Override public MessageChannel getOutputChannel() { if (this.outputChannelName != null) { this.outputChannel = getChannelResolver().resolveDestination(this.outputChannelName); this.outputChannelName = null; } return this.outputChannel; }
private AbstractIntegrationMessageBuilder<?> addRoutingSlipHeader(Object reply, List<?> routingSlip, AtomicInteger routingSlipIndex) { //TODO Migrate to the SF MessageBuilder AbstractIntegrationMessageBuilder<?> builder = null; if (reply instanceof Message) { builder = this.getMessageBuilderFactory().fromMessage((Message<?>) reply); } else if (reply instanceof AbstractIntegrationMessageBuilder) { builder = (AbstractIntegrationMessageBuilder<?>) reply; } else { builder = this.getMessageBuilderFactory().withPayload(reply); } builder.setHeader(IntegrationMessageHeaderAccessor.ROUTING_SLIP, Collections.singletonMap(routingSlip, routingSlipIndex.get())); return builder; }
checkReuse(messageProducer); if (channelName != null) { messageProducer.setOutputChannelName(channelName); messageProducer.setOutputChannel(outputChannel);
@Override protected void onInit() { super.onInit(); Assert.state(!(this.outputChannelName != null && this.outputChannel != null), //NOSONAR (inconsistent sync) "'outputChannelName' and 'outputChannel' are mutually exclusive."); if (getBeanFactory() != null) { this.messagingTemplate.setBeanFactory(getBeanFactory()); } this.messagingTemplate.setDestinationResolver(getChannelResolver()); }
@Override public void onSuccess(Object result) { Message<?> replyMessage = null; try { replyMessage = createOutputMessage(result, requestHeaders); sendOutput(replyMessage, theReplyChannel, false); } catch (Exception e) { Exception exceptionToLogAndSend = e; if (!(e instanceof MessagingException)) { exceptionToLogAndSend = new MessageHandlingException(requestMessage, e); if (replyMessage != null) { exceptionToLogAndSend = new MessagingException(replyMessage, exceptionToLogAndSend); } } logger.error("Failed to send async reply: " + result.toString(), exceptionToLogAndSend); onFailure(exceptionToLogAndSend); } }
protected Message<?> createOutputMessage(Object output, MessageHeaders requestHeaders) { AbstractIntegrationMessageBuilder<?> builder = null; if (output instanceof Message<?>) { if (this.noHeadersPropagation || !shouldCopyRequestHeaders()) { return (Message<?>) output; } builder = this.getMessageBuilderFactory().fromMessage((Message<?>) output); } else if (output instanceof AbstractIntegrationMessageBuilder) { builder = (AbstractIntegrationMessageBuilder<?>) output; } else { builder = this.getMessageBuilderFactory().withPayload(output); } if (!this.noHeadersPropagation && shouldCopyRequestHeaders()) { builder.filterAndCopyHeadersIfAbsent(requestHeaders, this.selectiveHeaderPropagation ? this.notPropagatedHeaders : null); } return builder.build(); }
routingSlipPathValue = getBeanFactory().getBean((String) path); return getOutputChannelFromRoutingSlip(reply, requestMessage, routingSlip, routingSlipIndex);
private void checkReuse(AbstractMessageProducingHandler replyHandler) { Assert.isTrue(!REFERENCED_REPLY_PRODUCERS.contains(replyHandler), "An AbstractMessageProducingHandler may only be referenced once (" + replyHandler.getComponentName() + ") - use @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) on @Bean definition."); REFERENCED_REPLY_PRODUCERS.add(replyHandler); }
@Bean @Primary @ServiceActivator(inputChannel = Sink.INPUT) public MessageHandler bridgeMessageHandler() { AbstractMessageProducingHandler messageHandler; if (StringUtils.hasText(this.cassandraSinkProperties.getIngestQuery())) { messageHandler = new MessageTransformingHandler( new PayloadToMatrixTransformer(this.cassandraSinkProperties.getIngestQuery(), CassandraMessageHandler.Type.UPDATE == cassandraSinkProperties.getQueryType() ? new UpdateQueryColumnNameExtractor() : new InsertQueryColumnNameExtractor())); } else { messageHandler = new BridgeHandler(); } messageHandler.setOutputChannel(toSink()); return messageHandler; }