Skip to content

Commit 1cc8d20

Browse files
committed
* Address PR comments
1 parent 0693170 commit 1cc8d20

File tree

2 files changed

+24
-9
lines changed

2 files changed

+24
-9
lines changed

spring-integration-core/src/main/java/org/springframework/integration/dispatcher/UnicastingDispatcher.java

+22-7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.ArrayList;
2020
import java.util.Iterator;
2121
import java.util.List;
22+
import java.util.Set;
2223
import java.util.concurrent.Executor;
2324

2425
import org.springframework.integration.MessageDispatchingException;
@@ -133,11 +134,11 @@ private boolean doDispatch(Message<?> message) {
133134
return true;
134135
}
135136
boolean success = false;
136-
Iterator<MessageHandler> handlerIterator = this.getHandlerIterator(message);
137+
Iterator<MessageHandler> handlerIterator = getHandlerIterator(message);
137138
if (!handlerIterator.hasNext()) {
138139
throw new MessageDispatchingException(message, "Dispatcher has no subscribers");
139140
}
140-
List<RuntimeException> exceptions = new ArrayList<>();
141+
List<RuntimeException> exceptions = null;
141142
while (!success && handlerIterator.hasNext()) {
142143
MessageHandler handler = handlerIterator.next();
143144
try {
@@ -148,11 +149,13 @@ private boolean doDispatch(Message<?> message) {
148149
RuntimeException runtimeException =
149150
IntegrationUtils.wrapInDeliveryExceptionIfNecessary(message,
150151
() -> "Dispatcher failed to deliver Message", ex);
152+
if (exceptions == null) {
153+
exceptions = new ArrayList<>();
154+
}
151155
exceptions.add(runtimeException);
152156
boolean isLast = !handlerIterator.hasNext();
153-
if (!isLast && this.failover && this.logger.isInfoEnabled()) {
154-
this.logger.info("An exception thrown from the '" + handler + "' for the '" + message + "'. " +
155-
"Will be in a failover for the next subscriber.", ex);
157+
if (!isLast && this.failover) {
158+
logExceptionBeforeFailOver(ex, handler, message);
156159
}
157160
handleExceptions(exceptions, message, isLast);
158161
}
@@ -166,10 +169,22 @@ private boolean doDispatch(Message<?> message) {
166169
* it simply returns the Iterator for the existing handler List.
167170
*/
168171
private Iterator<MessageHandler> getHandlerIterator(Message<?> message) {
172+
Set<MessageHandler> handlers = getHandlers();
169173
if (this.loadBalancingStrategy != null) {
170-
return this.loadBalancingStrategy.getHandlerIterator(message, this.getHandlers());
174+
return this.loadBalancingStrategy.getHandlerIterator(message, handlers);
175+
}
176+
return handlers.iterator();
177+
}
178+
179+
private void logExceptionBeforeFailOver(Exception ex, MessageHandler handler, Message<?> message) {
180+
if (this.logger.isInfoEnabled()) {
181+
this.logger.info("An exception was thrown by '" + handler + "' while handling '" + message + "': " +
182+
ex.getMessage() + ". Failing over to the next subscriber.");
183+
}
184+
else if (this.logger.isDebugEnabled()) {
185+
this.logger.debug("An exception was thrown by '" + handler + "' while handling '" + message +
186+
"'. Failing over to the next subscriber.", ex);
171187
}
172-
return this.getHandlers().iterator();
173188
}
174189

175190
/**

spring-integration-core/src/test/java/org/springframework/integration/dispatcher/RoundRobinDispatcherTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,15 @@ public void testFailOverAndLogging() {
154154

155155
DirectFieldAccessor directFieldAccessor = new DirectFieldAccessor(this.dispatcher);
156156
Log log = (Log) spy(directFieldAccessor.getPropertyType("logger"));
157-
given(log.isInfoEnabled()).willReturn(true);
157+
given(log.isDebugEnabled()).willReturn(true);
158158
directFieldAccessor.setPropertyValue("logger", log);
159159

160160
this.dispatcher.dispatch(this.message);
161161

162162
verify(this.handler).handleMessage(this.message);
163163
verify(this.differentHandler).handleMessage(this.message);
164164

165-
verify(log).info(startsWith("An exception thrown from the"), eq(testException));
165+
verify(log).debug(startsWith("An exception was thrown by '"), eq(testException));
166166
}
167167

168168
}

0 commit comments

Comments
 (0)