19
19
import java .util .ArrayList ;
20
20
import java .util .Iterator ;
21
21
import java .util .List ;
22
+ import java .util .Set ;
22
23
import java .util .concurrent .Executor ;
23
24
24
25
import org .springframework .integration .MessageDispatchingException ;
@@ -133,11 +134,11 @@ private boolean doDispatch(Message<?> message) {
133
134
return true ;
134
135
}
135
136
boolean success = false ;
136
- Iterator <MessageHandler > handlerIterator = this . getHandlerIterator (message );
137
+ Iterator <MessageHandler > handlerIterator = getHandlerIterator (message );
137
138
if (!handlerIterator .hasNext ()) {
138
139
throw new MessageDispatchingException (message , "Dispatcher has no subscribers" );
139
140
}
140
- List <RuntimeException > exceptions = new ArrayList <>() ;
141
+ List <RuntimeException > exceptions = null ;
141
142
while (!success && handlerIterator .hasNext ()) {
142
143
MessageHandler handler = handlerIterator .next ();
143
144
try {
@@ -148,11 +149,13 @@ private boolean doDispatch(Message<?> message) {
148
149
RuntimeException runtimeException =
149
150
IntegrationUtils .wrapInDeliveryExceptionIfNecessary (message ,
150
151
() -> "Dispatcher failed to deliver Message" , ex );
152
+ if (exceptions == null ) {
153
+ exceptions = new ArrayList <>();
154
+ }
151
155
exceptions .add (runtimeException );
152
156
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 );
156
159
}
157
160
handleExceptions (exceptions , message , isLast );
158
161
}
@@ -166,10 +169,22 @@ private boolean doDispatch(Message<?> message) {
166
169
* it simply returns the Iterator for the existing handler List.
167
170
*/
168
171
private Iterator <MessageHandler > getHandlerIterator (Message <?> message ) {
172
+ Set <MessageHandler > handlers = getHandlers ();
169
173
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 );
171
187
}
172
- return this .getHandlers ().iterator ();
173
188
}
174
189
175
190
/**
0 commit comments