From 9c2ddf99b52b59064b273ecd53a9f4d9b06b396a Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Tue, 16 Nov 2010 00:34:02 -0500 Subject: [PATCH] INT-1624 added errorChannel property to MessageProducerSupport, if not null, errorMessages will be sent there instead of being thrown to the caller --- .../endpoint/MessageProducerSupport.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/endpoint/MessageProducerSupport.java b/spring-integration-core/src/main/java/org/springframework/integration/endpoint/MessageProducerSupport.java index 835f2e4618..6e47a8de2f 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/endpoint/MessageProducerSupport.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/endpoint/MessageProducerSupport.java @@ -18,11 +18,13 @@ package org.springframework.integration.endpoint; import org.springframework.integration.Message; import org.springframework.integration.MessageChannel; +import org.springframework.integration.MessageDeliveryException; import org.springframework.integration.MessagingException; import org.springframework.integration.core.MessageProducer; import org.springframework.integration.core.MessagingTemplate; import org.springframework.integration.history.MessageHistory; import org.springframework.integration.history.TrackableComponent; +import org.springframework.integration.message.ErrorMessage; import org.springframework.util.Assert; /** @@ -35,6 +37,8 @@ public abstract class MessageProducerSupport extends AbstractEndpoint implements private volatile MessageChannel outputChannel; + private volatile MessageChannel errorChannel; + private volatile boolean shouldTrack = false; private final MessagingTemplate messagingTemplate = new MessagingTemplate(); @@ -44,6 +48,10 @@ public abstract class MessageProducerSupport extends AbstractEndpoint implements this.outputChannel = outputChannel; } + public void setErrorChannel(MessageChannel errorChannel) { + this.errorChannel = errorChannel; + } + public void setSendTimeout(long sendTimeout) { this.messagingTemplate.setSendTimeout(sendTimeout); } @@ -80,7 +88,20 @@ public abstract class MessageProducerSupport extends AbstractEndpoint implements if (this.shouldTrack) { message = MessageHistory.write(message, this); } - this.messagingTemplate.send(this.outputChannel, message); + try { + this.messagingTemplate.send(this.outputChannel, message); + } + catch (Exception e) { + if (this.errorChannel != null) { + this.messagingTemplate.send(this.errorChannel, new ErrorMessage(e)); + } + else if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } + else { + throw new MessageDeliveryException(message, "failed to send message", e); + } + } } }