From 889c08415105a51bf189d2bdcc2159e728a0d6c4 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Tue, 19 Aug 2014 10:40:11 -0400 Subject: [PATCH] INT-3499 AMQP Confirms/Returns Polishing JIRA: https://jira.spring.io/browse/INT-3499 - Suppress (log) 'null' payload error when no correlation data - Change tests to use a dedicated template for confirms/returns Conflicts: spring-integration-amqp/src/test/java/org/springframework/integration/amqp/config/AmqpOutboundChannelAdapterParserTests.java src/reference/docbook/amqp.xml Resolved. --- .../amqp/outbound/AmqpOutboundEndpoint.java | 6 ++++++ ...qpOutboundChannelAdapterParserTests-context.xml | 6 ++++++ .../AmqpOutboundChannelAdapterParserTests.java | 2 +- src/reference/docbook/amqp.xml | 14 ++++++++------ 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/outbound/AmqpOutboundEndpoint.java b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/outbound/AmqpOutboundEndpoint.java index ace6a68442..6e6ede6dad 100644 --- a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/outbound/AmqpOutboundEndpoint.java +++ b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/outbound/AmqpOutboundEndpoint.java @@ -272,6 +272,12 @@ public class AmqpOutboundEndpoint extends AbstractReplyProducingMessageHandler @Override public void confirm(CorrelationData correlationData, boolean ack) { Object userCorrelationData = correlationData; + if (correlationData == null) { + if (logger.isDebugEnabled()) { + logger.debug("No correlation data provided for ack: " + ack); + } + return; + } if (correlationData instanceof CorrelationDataWrapper) { userCorrelationData = ((CorrelationDataWrapper) correlationData).getUserData(); } diff --git a/spring-integration-amqp/src/test/java/org/springframework/integration/amqp/config/AmqpOutboundChannelAdapterParserTests-context.xml b/spring-integration-amqp/src/test/java/org/springframework/integration/amqp/config/AmqpOutboundChannelAdapterParserTests-context.xml index 96c79e8da1..54e6dafe7f 100644 --- a/spring-integration-amqp/src/test/java/org/springframework/integration/amqp/config/AmqpOutboundChannelAdapterParserTests-context.xml +++ b/spring-integration-amqp/src/test/java/org/springframework/integration/amqp/config/AmqpOutboundChannelAdapterParserTests-context.xml @@ -40,9 +40,12 @@ + + @@ -52,9 +55,12 @@ + + diff --git a/spring-integration-amqp/src/test/java/org/springframework/integration/amqp/config/AmqpOutboundChannelAdapterParserTests.java b/spring-integration-amqp/src/test/java/org/springframework/integration/amqp/config/AmqpOutboundChannelAdapterParserTests.java index 2a417c6817..0328338362 100644 --- a/spring-integration-amqp/src/test/java/org/springframework/integration/amqp/config/AmqpOutboundChannelAdapterParserTests.java +++ b/spring-integration-amqp/src/test/java/org/springframework/integration/amqp/config/AmqpOutboundChannelAdapterParserTests.java @@ -241,7 +241,7 @@ public class AmqpOutboundChannelAdapterParserTests { Message message = MessageBuilder.withPayload("hello").build(); requestChannel.send(message); PollableChannel returnChannel = context.getBean("returnChannel", PollableChannel.class); - RabbitTemplate template = context.getBean("amqpTemplate", RabbitTemplate.class); + RabbitTemplate template = context.getBean("amqpTemplateReturns", RabbitTemplate.class); Map headers = new HashMap(); headers.put(PublisherCallbackChannel.RETURN_CORRELATION, template.getUUID()); BasicProperties properties = mock(BasicProperties.class); diff --git a/src/reference/docbook/amqp.xml b/src/reference/docbook/amqp.xml index 24dbb924f6..8469d0ba8b 100644 --- a/src/reference/docbook/amqp.xml +++ b/src/reference/docbook/amqp.xml @@ -471,10 +471,12 @@ public Object handle(@Payload String payload, @Header(AmqpHeaders.CHANNEL) Chann An expression defining correlation data. When provided, this configures the underlying - amqp template to receive publisher confirms. Requires a RabbitTemplate and a + amqp template to receive publisher confirms. Requires a dedicated + RabbitTemplate and a CachingConnectionFactory with the publisherConfirms property set to true. When a publisher confirm - is received, it is written to either the confirm-ack-channel, or the confirm-nack-channel, + is received, and correlation data is supplied, + it is written to either the confirm-ack-channel, or the confirm-nack-channel, depending on the confirmation type. The payload of the confirm is the correlation data as defined by this expression and the message will have a header 'amqp_publishConfirm' set to true (ack) or false (nack). Examples: "headers['myCorrelationData']", "payload". @@ -497,8 +499,8 @@ public Object handle(@Payload String payload, @Header(AmqpHeaders.CHANNEL) Chann amqp_returnReplyText, amqp_returnExchange, amqp_returnRoutingKey. Optional. - Using a return-channel requires a RabbitTemplate with either - the mandatory or immediate properties set to true, + Using a return-channel requires a RabbitTemplate with + the mandatory property set to true, and a CachingConnectionFactory with the publisherReturns property set to true. When using multiple outbound endpoints with returns, a separate RabbitTemplate is needed @@ -585,8 +587,8 @@ public Object handle(@Payload String payload, @Header(AmqpHeaders.CHANNEL) Chann amqp_returnReplyText, amqp_returnExchange, amqp_returnRoutingKey. Optional. - Using a return-channel requires a RabbitTemplate with either - the mandatory or immediate properties set to true, + Using a return-channel requires a RabbitTemplate with + the mandatory property set to true, and a CachingConnectionFactory with the publisherReturns property set to true. When using multiple outbound endpoints with returns, a separate RabbitTemplate is needed