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 fd1abc04a62..078ed325a7a 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 16914e3aaa4..fa4ed41174b 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