From 6d55b3a592547fc335c73e7d071e511fea8f89b9 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 7 Jul 2017 20:44:09 +0200 Subject: [PATCH] Perform onException delegation outside of connection monitor Issue: SPR-15738 --- .../jms/connection/SingleConnectionFactory.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/spring-jms/src/main/java/org/springframework/jms/connection/SingleConnectionFactory.java b/spring-jms/src/main/java/org/springframework/jms/connection/SingleConnectionFactory.java index 3fea35c505..130ad46697 100644 --- a/spring-jms/src/main/java/org/springframework/jms/connection/SingleConnectionFactory.java +++ b/spring-jms/src/main/java/org/springframework/jms/connection/SingleConnectionFactory.java @@ -706,12 +706,14 @@ public class SingleConnectionFactory implements ConnectionFactory, QueueConnecti @Override public void onException(JMSException ex) { + // Iterate over temporary copy in order to avoid ConcurrentModificationException, + // since listener invocations may in turn trigger registration of listeners... + Set copy; synchronized (connectionMonitor) { - // Iterate over temporary copy in order to avoid ConcurrentModificationException, - // since listener invocations may in turn trigger registration of listeners... - for (ExceptionListener listener : new LinkedHashSet<>(this.delegates)) { - listener.onException(ex); - } + copy = new LinkedHashSet<>(this.delegates); + } + for (ExceptionListener listener : copy) { + listener.onException(ex); } } }