From 861c69a2ac4ce1dc379b3cbd69123f016d7cb695 Mon Sep 17 00:00:00 2001 From: maverickstuder Date: Tue, 2 Apr 2024 14:11:34 +0200 Subject: [PATCH] added standalone queue from tenant exchange for tenant creation handling --- build.gradle.kts | 2 +- .../MongoTenantMessagingConfiguration.java | 59 +++++++++++++++++++ .../liquibase/MongoTenantCreatedListener.java | 4 +- .../TenantMongoLiquibaseExecutor.java | 7 ++- 4 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/knecon/fforesight/mongo/database/commons/MongoTenantMessagingConfiguration.java diff --git a/build.gradle.kts b/build.gradle.kts index db2c7f4..755a889 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -27,7 +27,7 @@ repositories { val springBootVersion = "3.1.5" dependencies { - api("com.knecon.fforesight:tenant-commons:maverick-mongo") + api("com.knecon.fforesight:tenant-commons:maverick-mongo-eval") api("org.liquibase:liquibase-core:4.20.0") api("org.liquibase.ext:liquibase-mongodb:4.20.0") api("org.springframework.boot:spring-boot-starter-data-mongodb:${springBootVersion}") diff --git a/src/main/java/com/knecon/fforesight/mongo/database/commons/MongoTenantMessagingConfiguration.java b/src/main/java/com/knecon/fforesight/mongo/database/commons/MongoTenantMessagingConfiguration.java new file mode 100644 index 0000000..5c93b19 --- /dev/null +++ b/src/main/java/com/knecon/fforesight/mongo/database/commons/MongoTenantMessagingConfiguration.java @@ -0,0 +1,59 @@ +package com.knecon.fforesight.mongo.database.commons; + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.core.QueueBuilder; +import org.springframework.amqp.core.TopicExchange; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; + +import com.knecon.fforesight.mongo.database.commons.liquibase.EnableMongoLiquibaseCondition; + +import lombok.RequiredArgsConstructor; + +@Configuration +@RequiredArgsConstructor +@Conditional(EnableMongoLiquibaseCondition.class) +public class MongoTenantMessagingConfiguration { + + @Value("${fforesight.mongo.multitenancy.tenant-created-queue:tenant-created}") + private String tenantCreatedEventQueue; + + @Value("${fforesight.mongo.multitenancy.tenant-created-dlq:tenant-created-dlq}") + private String tenantCreatedDLQ; + + + @Bean(name = "mongoTenantExchange") + TopicExchange mongoTenantExchange(@Value("${fforesight.tenant-exchange.name}") String tenantExchangeName) { + + return new TopicExchange(tenantExchangeName); + } + + + @Bean("persistenceServiceMongoTenantCreatedQueue") + public Queue persistenceServiceMongoTenantCreatedQueue() { + + return QueueBuilder.durable(tenantCreatedEventQueue) + .withArgument("x-dead-letter-exchange", "").withArgument("x-dead-letter-routing-key", tenantCreatedDLQ).build(); + } + + + @Bean + public Queue persistenceServiceMongoTenantDLQ() { + + return QueueBuilder.durable(tenantCreatedDLQ).build(); + } + + + @Bean + public Binding tenantExchangeBinding(@Qualifier("persistenceServiceMongoTenantCreatedQueue") Queue persistenceServiceTenantCreatedQueue, + @Qualifier("mongoTenantExchange") TopicExchange tenantExchange) { + + return BindingBuilder.bind(persistenceServiceTenantCreatedQueue).to(tenantExchange).with("tenant.created"); + } + +} diff --git a/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/MongoTenantCreatedListener.java b/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/MongoTenantCreatedListener.java index 657e499..f3246d2 100644 --- a/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/MongoTenantCreatedListener.java +++ b/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/MongoTenantCreatedListener.java @@ -18,7 +18,7 @@ public class MongoTenantCreatedListener { private final TenantMongoLiquibaseExecutor tenantMongoLiquibaseExecutor; - @Value("${fforesight.multitenancy.tenant-created-queue:tenant-created}") + @Value("${fforesight.multitenancy.mongo.tenant-created-queue:mongo-tenant-created}") private String tenantCreatedQueue; @@ -30,7 +30,7 @@ public class MongoTenantCreatedListener { @SneakyThrows - @RabbitListener(queues = "${fforesight.multitenancy.tenant-created-queue:tenant-created}") + @RabbitListener(queues = "${fforesight.multitenancy.mongo.tenant-created-queue:mongo-tenant-created}") public void createTenant(MongoTenantCreatedEvent tenantRequest) { tenantMongoLiquibaseExecutor.initializeTenant(tenantRequest.getTenantId()); diff --git a/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/TenantMongoLiquibaseExecutor.java b/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/TenantMongoLiquibaseExecutor.java index 3c12bf6..c14a1e1 100644 --- a/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/TenantMongoLiquibaseExecutor.java +++ b/src/main/java/com/knecon/fforesight/mongo/database/commons/liquibase/TenantMongoLiquibaseExecutor.java @@ -64,10 +64,11 @@ public class TenantMongoLiquibaseExecutor implements InitializingBean, ResourceL var mongoUrl = MongoUtils.buildMongoUrl(mongoDBConnection); log.info("Initializing MongoDB liquibase for tenant {} / {}", tenant.getTenantId(), mongoUrl); - try (MongoLiquibaseDatabase database = (MongoLiquibaseDatabase) DatabaseFactory.getInstance() - .openDatabase(mongoUrl, mongoDBConnection.getUsername(), encryptionService.decrypt(mongoDBConnection.getPassword()), null, null)) { + try (SpringResourceAccessor resourceAccessor = new SpringResourceAccessor(resourceLoader)) { - try (SpringResourceAccessor resourceAccessor = new SpringResourceAccessor(resourceLoader)) { + try (MongoLiquibaseDatabase database = (MongoLiquibaseDatabase) DatabaseFactory.getInstance() + .openDatabase(mongoUrl, mongoDBConnection.getUsername(), encryptionService.decrypt(mongoDBConnection.getPassword()), null, resourceAccessor)) { + database.setSupportsValidator(false); try (Liquibase liquibase = new Liquibase(tenantMongoLiquibaseProperties.getChangeLog(), resourceAccessor, database)) { Contexts contexts = new Contexts(tenantMongoLiquibaseProperties.getContexts()); List changeSetsList = liquibase.listUnrunChangeSets(contexts, null);