From 72ce758593f91e5a41ce573380371a9eaa32eb54 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Fri, 3 Nov 2023 17:09:37 -0400 Subject: [PATCH] Fix KV store for group-to-message relationship The `this.messagePrefix + groupId + '_' + messageId` logic is introduced since `6.2` via: https://github.com/spring-projects/spring-integration/commit/64f8ed5bab7af8f02b38dbb7dd3b65b7379169ae The current fix for new `getMessageFromGroup()` and `removeMessageFromGroupById()` is to retrieve group and then perform plain `get` and `delete` against just message id Related to: https://github.com/spring-projects/spring-integration/issues/8773 --- .../store/AbstractKeyValueMessageStore.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/store/AbstractKeyValueMessageStore.java b/spring-integration-core/src/main/java/org/springframework/integration/store/AbstractKeyValueMessageStore.java index eea05f4e77..27bc68cfff 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/store/AbstractKeyValueMessageStore.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/store/AbstractKeyValueMessageStore.java @@ -269,13 +269,19 @@ public abstract class AbstractKeyValueMessageStore extends AbstractMessageGroupS public Message getMessageFromGroup(Object groupId, UUID messageId) { Assert.notNull(groupId, GROUP_ID_MUST_NOT_BE_NULL); Assert.notNull(messageId, "'messageId' must not be null"); - Object object = doRetrieve(this.messagePrefix + groupId + '_' + messageId); - if (object != null) { - return extractMessage(object); - } - else { - return null; + + Object mgm = doRetrieve(this.groupPrefix + groupId); + if (mgm != null) { + Assert.isInstanceOf(MessageGroupMetadata.class, mgm); + MessageGroupMetadata messageGroupMetadata = (MessageGroupMetadata) mgm; + + for (UUID id : messageGroupMetadata.getMessageIds()) { + if (id.equals(messageId)) { + return getMessage(messageId); + } + } } + return null; } @Override @@ -289,8 +295,7 @@ public abstract class AbstractKeyValueMessageStore extends AbstractMessageGroupS if (messageGroupMetadata.getMessageIds().contains(messageId)) { messageGroupMetadata.remove(messageId); - String groupToMessageId = this.messagePrefix + groupId + '_' + messageId; - if (doRemove(groupToMessageId) != null) { + if (removeMessage(messageId) != null) { messageGroupMetadata.setLastModified(System.currentTimeMillis()); doStore(this.groupPrefix + groupId, messageGroupMetadata); return true;