From b6a3808a97c8e75ac754ccc75aebd956a4db783f Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sat, 4 Oct 2014 00:40:53 +0200 Subject: [PATCH] AbstractMessageChannel triggers afterSendCompletion with previously resolved non-null Message in case of preSend returning null Issue: SPR-12295 --- .../support/AbstractMessageChannel.java | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java b/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java index a0f79d1cfc..56e663ca28 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -37,7 +37,7 @@ import org.springframework.util.ObjectUtils; * @author Rossen Stoyanchev * @since 4.0 */ -public abstract class AbstractMessageChannel implements MessageChannel, BeanNameAware, InterceptableChannel { +public abstract class AbstractMessageChannel implements MessageChannel, InterceptableChannel, BeanNameAware { protected final Log logger = LogFactory.getLog(getClass()); @@ -50,9 +50,9 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName this.beanName = getClass().getSimpleName() + "@" + ObjectUtils.getIdentityHexString(this); } + /** - * {@inheritDoc} - *

Used primarily for logging purposes. + * A message channel uses the bean name primarily for logging purposes. */ @Override public void setBeanName(String name) { @@ -60,12 +60,13 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName } /** - * @return the name for this channel. + * Return the bean name for this message channel. */ public String getBeanName() { return this.beanName; } + @Override public void setInterceptors(List interceptors) { this.interceptors.clear(); @@ -82,10 +83,6 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName this.interceptors.add(index, interceptor); } - /** - * {@inheritDoc} - *

The returned list is read-only. - */ @Override public List getInterceptors() { return Collections.unmodifiableList(this.interceptors); @@ -101,6 +98,7 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName return this.interceptors.remove(index); } + @Override public final boolean send(Message message) { return send(message, INDEFINITE_TIMEOUT); @@ -129,7 +127,8 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName throw new MessageDeliveryException(message,"Failed to send message to " + this, ex); } catch (Error ex) { - MessageDeliveryException ex2 = new MessageDeliveryException(message, "Failed to send message to " + this, ex); + MessageDeliveryException ex2 = + new MessageDeliveryException(message, "Failed to send message to " + this, ex); chain.triggerAfterSendCompletion(message, this, sent, ex2); throw ex2; } @@ -153,21 +152,22 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName private int receiveInterceptorIndex = -1; - public Message applyPreSend(Message message, MessageChannel channel) { + Message messageToUse = message; for (ChannelInterceptor interceptor : interceptors) { - message = interceptor.preSend(message, channel); - if (message == null) { + Message resolvedMessage = interceptor.preSend(messageToUse, channel); + if (resolvedMessage == null) { String name = interceptor.getClass().getSimpleName(); if (logger.isDebugEnabled()) { logger.debug(name + " returned null from preSend, i.e. precluding the send."); } - triggerAfterSendCompletion(message, channel, false, null); + triggerAfterSendCompletion(messageToUse, channel, false, null); return null; } + messageToUse = resolvedMessage; this.sendInterceptorIndex++; } - return message; + return messageToUse; } public void applyPostSend(Message message, MessageChannel channel, boolean sent) { @@ -216,11 +216,12 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName interceptor.afterReceiveCompletion(message, channel, ex); } catch (Throwable ex2) { - logger.error("Exception from afterReceiveCompletion in " + interceptor, ex2); + if (logger.isErrorEnabled()) { + logger.error("Exception from afterReceiveCompletion in " + interceptor, ex2); + } } } } - } -} \ No newline at end of file +} -- GitLab