From 97eddb769a15535b462f2a6c4f106c6200991e94 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Thu, 18 Apr 2024 14:18:11 +0100 Subject: [PATCH] Avoid duplicate subscriptionId's in destinationCache Closes gh-32625 --- .../simp/broker/DefaultSubscriptionRegistry.java | 5 ++++- .../simp/broker/DefaultSubscriptionRegistryTests.java | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) 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 fd1abc04a6..078ed325a7 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -305,6 +305,9 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry { return Collections.singletonList(subscriptionId); } else { + if (subscriptionIds.contains(subscriptionId)) { + return subscriptionIds; + } List result = new ArrayList<>(subscriptionIds.size() + 1); result.addAll(subscriptionIds); result.add(subscriptionId); diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java index 16914e3aaa..fa4ed41174 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java @@ -102,6 +102,16 @@ class DefaultSubscriptionRegistryTests { MultiValueMap actual = this.registry.findSubscriptions(createMessage(dest)); assertThat(actual).hasSize(1); assertThat(actual.get(sessId)).containsExactly(subId); + + // Register more after destinationCache populated through findSubscriptions, + // and make sure it's still only one subscriptionId + + this.registry.registerSubscription(subscribeMessage(sessId, subId, dest)); + this.registry.registerSubscription(subscribeMessage(sessId, subId, dest)); + + actual = this.registry.findSubscriptions(createMessage(dest)); + assertThat(actual).hasSize(1); + assertThat(actual.get(sessId)).containsExactly(subId); } @Test