From 5a8e470ede922249eae77154666829a3fec2bf52 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 4 Jun 2014 22:48:34 +0200 Subject: [PATCH] DefaultSubscriptionRegistry's removeSubscriptionInternal defensively handles non-existing destinations Issue: SPR-11832 --- .../broker/DefaultSubscriptionRegistry.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java index f228099f4f4..fa38761851b 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java @@ -48,12 +48,12 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry { /** The maximum number of entries in the cache */ private volatile int cacheLimit = DEFAULT_CACHE_LIMIT; + private PathMatcher pathMatcher = new AntPathMatcher(); + private final DestinationCache destinationCache = new DestinationCache(); private final SessionSubscriptionRegistry subscriptionRegistry = new SessionSubscriptionRegistry(); - private PathMatcher pathMatcher = new AntPathMatcher(); - /** * Specify the maximum number of entries for the resolved destination cache. @@ -71,19 +71,20 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry { } /** - * The PathMatcher to use. + * Specify the {@link PathMatcher} to use. */ public void setPathMatcher(PathMatcher pathMatcher) { this.pathMatcher = pathMatcher; } /** - * The configured PathMatcher. + * Return the configured {@link PathMatcher}. */ public PathMatcher getPathMatcher() { return this.pathMatcher; } + @Override protected void addSubscriptionInternal(String sessionId, String subsId, String destination, Message message) { this.subscriptionRegistry.addSubscription(sessionId, subsId, destination); @@ -95,7 +96,7 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry { SessionSubscriptionInfo info = this.subscriptionRegistry.getSubscriptions(sessionId); if (info != null) { String destination = info.removeSubscription(subsId); - if (info.getSubscriptions(destination) == null) { + if (destination != null && info.getSubscriptions(destination) == null) { this.destinationCache.updateAfterRemovedSubscription(destination, sessionId, subsId); } } @@ -206,9 +207,9 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry { } } } - for (String d : destinationsToRemove) { - this.updateCache.remove(d); - this.accessCache.remove(d); + for (String destinationToRemove : destinationsToRemove) { + this.updateCache.remove(destinationToRemove); + this.accessCache.remove(destinationToRemove); } } }