From 77e8f4f20b93f63197c032825704944a06fd1267 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Tue, 13 Oct 2020 14:23:02 -0400 Subject: [PATCH] GH-307: Fix circular bean reference Resolves https://github.com/spring-cloud/spring-cloud-stream-binder-rabbit/issues/307 Fix `ConnectionNameStrategy` circular bean reference. While not intuitive, retain the existing behavior whereby the presence of a `ConnectionNameStrategy` bean overides the property. --- ...bbitMessageChannelBinderConfiguration.java | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/spring-cloud-stream-binder-rabbit/src/main/java/org/springframework/cloud/stream/binder/rabbit/config/RabbitMessageChannelBinderConfiguration.java b/spring-cloud-stream-binder-rabbit/src/main/java/org/springframework/cloud/stream/binder/rabbit/config/RabbitMessageChannelBinderConfiguration.java index d16fd9944..df1a73f42 100644 --- a/spring-cloud-stream-binder-rabbit/src/main/java/org/springframework/cloud/stream/binder/rabbit/config/RabbitMessageChannelBinderConfiguration.java +++ b/spring-cloud-stream-binder-rabbit/src/main/java/org/springframework/cloud/stream/binder/rabbit/config/RabbitMessageChannelBinderConfiguration.java @@ -21,16 +21,13 @@ import java.util.concurrent.atomic.AtomicInteger; import org.springframework.amqp.core.DeclarableCustomizer; import org.springframework.amqp.core.MessagePostProcessor; -import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; -import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.connection.AbstractConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionNameStrategy; import org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer; import org.springframework.amqp.support.postprocessor.DelegatingDecompressingPostProcessor; import org.springframework.amqp.support.postprocessor.GZipPostProcessor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.amqp.RabbitProperties; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.stream.binder.rabbit.RabbitMessageChannelBinder; @@ -65,7 +62,7 @@ import org.springframework.lang.Nullable; public class RabbitMessageChannelBinderConfiguration { @Autowired - private ConnectionFactory rabbitConnectionFactory; + private AbstractConnectionFactory rabbitConnectionFactory; @Autowired private RabbitProperties rabbitProperties; @@ -82,8 +79,15 @@ public class RabbitMessageChannelBinderConfiguration { @Nullable MessageSourceCustomizer sourceCustomizer, @Nullable ProducerMessageHandlerCustomizer producerMessageHandlerCustomizer, @Nullable ConsumerEndpointCustomizer consumerCustomizer, - List declarableCustomizers) { + List declarableCustomizers, + @Nullable ConnectionNameStrategy connectionNameStrategy) { + String connectionNamePrefix = this.rabbitBinderConfigurationProperties.getConnectionNamePrefix(); + if (connectionNamePrefix != null && connectionNameStrategy == null) { + final AtomicInteger nameIncrementer = new AtomicInteger(); + this.rabbitConnectionFactory.setConnectionNameStrategy(f -> connectionNamePrefix + + "#" + nameIncrementer.getAndIncrement()); + } RabbitMessageChannelBinder binder = new RabbitMessageChannelBinder( this.rabbitConnectionFactory, this.rabbitProperties, provisioningProvider(declarableCustomizers), listenerContainerCustomizer, sourceCustomizer); @@ -115,16 +119,4 @@ public class RabbitMessageChannelBinderConfiguration { RabbitExchangeQueueProvisioner provisioningProvider(List customizers) { return new RabbitExchangeQueueProvisioner(this.rabbitConnectionFactory, customizers); } - - @Bean - @ConditionalOnMissingBean(ConnectionNameStrategy.class) - @ConditionalOnProperty("spring.cloud.stream.rabbit.binder.connection-name-prefix") - public ConnectionNameStrategy connectionNamer(CachingConnectionFactory cf) { - final AtomicInteger nameIncrementer = new AtomicInteger(); - ConnectionNameStrategy namer = f -> this.rabbitBinderConfigurationProperties - .getConnectionNamePrefix() + "#" + nameIncrementer.getAndIncrement(); - cf.setConnectionNameStrategy(namer); - return namer; - } - }