From 32eba4ecb9537d064311025397e955aad47897c4 Mon Sep 17 00:00:00 2001 From: Adama Sorho Date: Mon, 28 Aug 2023 15:02:58 -0400 Subject: [PATCH] GH-8692 Add createIndexes to MongoDbMessageStore Fixes https://github.com/spring-projects/spring-integration/issues/8692 * Added `createIndexes` in `AbstractConfigurableMongoDbMessageStore` * Added Javadoc for `setCreateIndex()` method * Removed `afterPropertiesSet()` in `MongoDbChannelMessageStore` and update `whats-new.adoc` and `mongodb.adoc` files **Cherry-pick to `6.1.x` & `6.0.x`** --- ...stractConfigurableMongoDbMessageStore.java | 20 ++++++++++++- .../store/MongoDbChannelMessageStore.java | 7 +++-- ...igurableMongoDbMessageGroupStoreTests.java | 10 +++++++ ...bleMongoDbMessageStore-CustomConverter.xml | 2 ++ .../antora/modules/ROOT/pages/mongodb.adoc | 29 +++++++++++++++++++ .../antora/modules/ROOT/pages/whats-new.adoc | 8 ++++- 6 files changed, 71 insertions(+), 5 deletions(-) diff --git a/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/AbstractConfigurableMongoDbMessageStore.java b/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/AbstractConfigurableMongoDbMessageStore.java index fc2870897a..518fb85f2d 100644 --- a/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/AbstractConfigurableMongoDbMessageStore.java +++ b/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/AbstractConfigurableMongoDbMessageStore.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2022 the original author or authors. + * Copyright 2014-2023 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. @@ -60,6 +60,7 @@ import org.springframework.util.Assert; * for implementations of this class. * * @author Artem Bilan + * @author Adama Sorho * * @since 4.0 */ @@ -86,6 +87,8 @@ public abstract class AbstractConfigurableMongoDbMessageStore extends AbstractMe private MessageBuilderFactory messageBuilderFactory = new DefaultMessageBuilderFactory(); + private boolean createIndexes = true; + public AbstractConfigurableMongoDbMessageStore(MongoTemplate mongoTemplate, String collectionName) { Assert.notNull(mongoTemplate, "'mongoTemplate' must not be null"); Assert.hasText(collectionName, "'collectionName' must not be empty"); @@ -107,6 +110,15 @@ public abstract class AbstractConfigurableMongoDbMessageStore extends AbstractMe this.mappingMongoConverter = mappingMongoConverter; } + /** + * Define the option to auto create indexes or not. + * @param createIndexes a boolean. + * @since 6.0.8. + */ + public void setCreateIndexes(boolean createIndexes) { + this.createIndexes = createIndexes; + } + @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; @@ -146,6 +158,12 @@ public abstract class AbstractConfigurableMongoDbMessageStore extends AbstractMe this.messageBuilderFactory = IntegrationUtils.getMessageBuilderFactory(this.applicationContext); + if (this.createIndexes) { + createIndexes(); + } + } + + protected void createIndexes() { IndexOperations indexOperations = this.mongoTemplate.indexOps(this.collectionName); indexOperations.ensureIndex(new Index(MessageDocumentFields.MESSAGE_ID, Sort.Direction.ASC)); diff --git a/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbChannelMessageStore.java b/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbChannelMessageStore.java index 4e90dcf733..76ee7da77a 100644 --- a/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbChannelMessageStore.java +++ b/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbChannelMessageStore.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2020 the original author or authors. + * Copyright 2014-2023 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. @@ -43,6 +43,7 @@ import org.springframework.util.Assert; * {@code priorityEnabled = true} option. * * @author Artem Bilan + * @author Adama Sorho * * @since 4.0 */ @@ -94,8 +95,8 @@ public class MongoDbChannelMessageStore extends AbstractConfigurableMongoDbMessa } @Override - public void afterPropertiesSet() { - super.afterPropertiesSet(); + protected void createIndexes() { + super.createIndexes(); getMongoTemplate() .indexOps(this.collectionName) .ensureIndex(new Index(MessageDocumentFields.GROUP_ID, Sort.Direction.ASC) diff --git a/spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageGroupStoreTests.java b/spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageGroupStoreTests.java index d4c74e4707..4519f8ecde 100644 --- a/spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageGroupStoreTests.java +++ b/spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageGroupStoreTests.java @@ -16,6 +16,7 @@ package org.springframework.integration.mongodb.store; +import java.util.List; import java.util.Map; import org.bson.Document; @@ -25,6 +26,8 @@ import org.junit.jupiter.api.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.convert.converter.Converter; import org.springframework.data.convert.ReadingConverter; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.index.IndexInfo; import org.springframework.integration.IntegrationMessageHeaderAccessor; import org.springframework.integration.channel.PriorityChannel; import org.springframework.integration.channel.QueueChannel; @@ -42,6 +45,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Amol Nayak * @author Artem Bilan * @author Artem Vozhdayenko + * @author Adama Sorho * */ class ConfigurableMongoDbMessageGroupStoreTests extends AbstractMongoDbMessageGroupStoreTests { @@ -134,6 +138,12 @@ class ConfigurableMongoDbMessageGroupStoreTests extends AbstractMongoDbMessageGr .getClass()); context.refresh(); + List indexesInfo = + new MongoTemplate(MONGO_DATABASE_FACTORY) + .indexOps("customConverterCollection") + .getIndexInfo(); + assertThat(indexesInfo).hasSize(0); + TestGateway gateway = context.getBean(TestGateway.class); String result = gateway.service("foo"); assertThat(result).isEqualTo("FOO"); diff --git a/spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageStore-CustomConverter.xml b/spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageStore-CustomConverter.xml index 8f83be8288..ea96a3eacc 100644 --- a/spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageStore-CustomConverter.xml +++ b/spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageStore-CustomConverter.xml @@ -29,6 +29,8 @@ + + ---- +[[abstract-configurable-mongodb-message-store-with-auto-index-creation-disable]] +=== Using AbstractConfigurableMongoDbMessageStore with auto index creation disable +Starting with version 6.0.8, the `AbstractConfigurableMongoDbMessageStore` implements a `setCreateIndex(boolean)` which can be use to desable or enable (default) the auto index creation. +The following example shows how to declare a bean and disable the auto index creation: + +[source, java] +---- +@Bean +public AbstractConfigurableMongoDbMessageStore mongoDbChannelMessageStore(MongoDatabaseFactory databaseFactory) +{ + AbstractConfigurableMongoDbMessageStore mongoDbChannelMessageStore = new MongoDbChannelMessageStore(databaseFactory); + mongoDbChannelMessageStore.setCreateIndex(false); + + return mongoDbChannelMessageStore; +} +---- [[mongodb-metadata-store]] === MongoDB Metadata Store diff --git a/src/reference/antora/modules/ROOT/pages/whats-new.adoc b/src/reference/antora/modules/ROOT/pages/whats-new.adoc index 41ffd572de..c7fd7eb5f5 100644 --- a/src/reference/antora/modules/ROOT/pages/whats-new.adoc +++ b/src/reference/antora/modules/ROOT/pages/whats-new.adoc @@ -37,7 +37,7 @@ See, for example, `transformWith()`, `splitWith()` in xref:dsl.adoc#java-dsl[ Ja See xref:configuration/global-properties.adoc[Global Properties] for more information. - The `@MessagingGateway` and `GatewayEndpointSpec` provided by the Java DSL now expose the `errorOnTimeout` property of the internal `MethodInvocationGateway` extension of the `MessagingGatewaySupport`. -See xref:gateway.adoc#gateway-no-response[Gateway Behavior When No response Arrives] for more information. +See xref:gateway.adoc#gateway-no-response[ Gateway Behavior When No response Arrives] for more information. [[x6.2-websockets]] === WebSockets Changes @@ -57,3 +57,9 @@ See xref:kafka.adoc#kafka-inbound-pollable[Kafka Inbound Channel Adapter] for mo The `JdbcMessageStore`, `JdbcChannelMessageStore`, `JdbcMetadataStore`, and `DefaultLockRepository` implement `SmartLifecycle` and perform a`SELECT COUNT` query, on their respective tables, in the `start()` method to ensure that the required table (according to the provided prefix) is present in the target database. See xref:jdbc/message-store.adoc#jdbc-db-init[Initializing the Database] for more information. + +[[x6.2-mongodb]] +=== MongoDB support change + +A new option `setCreateIndexes(boolean)` has been introduced in `AbstractConfigurableMongoDbMessageStore` to disable the auto indexes creation. +See xref:mongodb.adoc#mongodb-message-store[MongoDB Message Store] for an example.