Browse Source

AbstractMessageChannel triggers afterSendCompletion with previously resolved non-null Message in case of preSend returning null

Issue: SPR-12295
pull/644/merge
Juergen Hoeller 12 years ago
parent
commit
b6a3808a97
  1. 37
      spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java

37
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 not use this file except in compliance with the License.
* You may obtain a copy of the License at * 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 * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -37,7 +37,7 @@ import org.springframework.util.ObjectUtils;
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
* @since 4.0 * @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()); 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); this.beanName = getClass().getSimpleName() + "@" + ObjectUtils.getIdentityHexString(this);
} }
/** /**
* {@inheritDoc} * A message channel uses the bean name primarily for logging purposes.
* <p>Used primarily for logging purposes.
*/ */
@Override @Override
public void setBeanName(String name) { 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() { public String getBeanName() {
return this.beanName; return this.beanName;
} }
@Override @Override
public void setInterceptors(List<ChannelInterceptor> interceptors) { public void setInterceptors(List<ChannelInterceptor> interceptors) {
this.interceptors.clear(); this.interceptors.clear();
@ -82,10 +83,6 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName
this.interceptors.add(index, interceptor); this.interceptors.add(index, interceptor);
} }
/**
* {@inheritDoc}
* <p>The returned list is read-only.
*/
@Override @Override
public List<ChannelInterceptor> getInterceptors() { public List<ChannelInterceptor> getInterceptors() {
return Collections.unmodifiableList(this.interceptors); return Collections.unmodifiableList(this.interceptors);
@ -101,6 +98,7 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName
return this.interceptors.remove(index); return this.interceptors.remove(index);
} }
@Override @Override
public final boolean send(Message<?> message) { public final boolean send(Message<?> message) {
return send(message, INDEFINITE_TIMEOUT); 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); throw new MessageDeliveryException(message,"Failed to send message to " + this, ex);
} }
catch (Error 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); chain.triggerAfterSendCompletion(message, this, sent, ex2);
throw ex2; throw ex2;
} }
@ -153,21 +152,22 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName
private int receiveInterceptorIndex = -1; private int receiveInterceptorIndex = -1;
public Message<?> applyPreSend(Message<?> message, MessageChannel channel) { public Message<?> applyPreSend(Message<?> message, MessageChannel channel) {
Message<?> messageToUse = message;
for (ChannelInterceptor interceptor : interceptors) { for (ChannelInterceptor interceptor : interceptors) {
message = interceptor.preSend(message, channel); Message<?> resolvedMessage = interceptor.preSend(messageToUse, channel);
if (message == null) { if (resolvedMessage == null) {
String name = interceptor.getClass().getSimpleName(); String name = interceptor.getClass().getSimpleName();
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug(name + " returned null from preSend, i.e. precluding the send."); logger.debug(name + " returned null from preSend, i.e. precluding the send.");
} }
triggerAfterSendCompletion(message, channel, false, null); triggerAfterSendCompletion(messageToUse, channel, false, null);
return null; return null;
} }
messageToUse = resolvedMessage;
this.sendInterceptorIndex++; this.sendInterceptorIndex++;
} }
return message; return messageToUse;
} }
public void applyPostSend(Message<?> message, MessageChannel channel, boolean sent) { 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); interceptor.afterReceiveCompletion(message, channel, ex);
} }
catch (Throwable ex2) { catch (Throwable ex2) {
logger.error("Exception from afterReceiveCompletion in " + interceptor, ex2); if (logger.isErrorEnabled()) {
logger.error("Exception from afterReceiveCompletion in " + interceptor, ex2);
}
} }
} }
} }
} }
} }

Loading…
Cancel
Save