diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfiguration.java index b91883fb29..993554ee2c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfiguration.java @@ -125,7 +125,7 @@ public class RabbitAutoConfiguration { map.from(properties::getRequestedHeartbeat).whenNonNull().asInt(Duration::getSeconds) .to(factory::setRequestedHeartbeat); RabbitProperties.Ssl ssl = properties.getSsl(); - if (ssl.isEnabled()) { + if (ssl.determineEnabled()) { factory.setUseSSL(true); map.from(ssl::getAlgorithm).whenNonNull().to(factory::setSslAlgorithm); map.from(ssl::getKeyStoreType).to(factory::setKeyStoreType); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java index d4cdb912f1..349311597e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java @@ -310,7 +310,7 @@ public class RabbitProperties { return this.template; } - public static class Ssl { + public class Ssl { /** * Whether to enable SSL support. @@ -366,6 +366,21 @@ public class RabbitProperties { return this.enabled; } + /** + * Returns whether SSL is enabled from the first address, or the configured ssl + * enabled flag if no addresses have been set. + * @return whether ssl is enabled + * @see #setAddresses(String) + * @see #isEnabled() + */ + public boolean determineEnabled() { + if (CollectionUtils.isEmpty(RabbitProperties.this.parsedAddresses)) { + return isEnabled(); + } + Address address = RabbitProperties.this.parsedAddresses.get(0); + return address.secureConnection; + } + public void setEnabled(boolean enabled) { this.enabled = enabled; } @@ -951,7 +966,7 @@ public class RabbitProperties { private String virtualHost; - private boolean isSecureConnection; + private boolean secureConnection; private Address(String input) { input = input.trim(); @@ -963,7 +978,7 @@ public class RabbitProperties { private String trimPrefix(String input) { if (input.startsWith(PREFIX_AMQP_SECURE)) { - this.isSecureConnection = true; + this.secureConnection = true; return input.substring(PREFIX_AMQP_SECURE.length()); } if (input.startsWith(PREFIX_AMQP)) { @@ -1002,12 +1017,7 @@ public class RabbitProperties { int portIndex = input.indexOf(':'); if (portIndex == -1) { this.host = input; - if (this.isSecureConnection) { - this.port = DEFAULT_PORT_SECURE; - } - else { - this.port = DEFAULT_PORT; - } + this.port = (this.secureConnection) ? DEFAULT_PORT_SECURE : DEFAULT_PORT; } else { this.host = input.substring(0, portIndex); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitPropertiesTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitPropertiesTests.java index 5670aeb8e9..917c09847d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitPropertiesTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitPropertiesTests.java @@ -70,13 +70,6 @@ public class RabbitPropertiesTests { assertThat(this.properties.getPort()).isEqualTo(1234); } - @Test - void usingSecuredConnections() { - this.properties.setAddresses("amqps://root:password@otherhost,amqps://root:password2@otherhost2"); - assertThat(this.properties.determinePort()).isEqualTo(5671); - assertThat(this.properties.determineAddresses()).isEqualTo("otherhost:5671,otherhost2:5671"); - } - @Test public void determinePortReturnsPortOfFirstAddress() { this.properties.setAddresses("rabbit1.example.com:1234,rabbit2.example.com:2345"); @@ -96,6 +89,18 @@ public class RabbitPropertiesTests { assertThat(this.properties.determinePort()).isEqualTo(5672); } + @Test + public void determinePortUsingAmqpReturnsPortOfFirstAddress() { + this.properties.setAddresses("amqp://root:password@otherhost,amqps://root:password2@otherhost2"); + assertThat(this.properties.determinePort()).isEqualTo(5672); + } + + @Test + public void determinePortUsingAmqpsReturnsPortOfFirstAddress() { + this.properties.setAddresses("amqps://root:password@otherhost,amqp://root:password2@otherhost2"); + assertThat(this.properties.determinePort()).isEqualTo(5671); + } + @Test public void virtualHostDefaultsToNull() { assertThat(this.properties.getVirtualHost()).isNull(); @@ -229,6 +234,24 @@ public class RabbitPropertiesTests { assertThat(this.properties.determineAddresses()).isEqualTo("rabbit.example.com:1234"); } + @Test + public void determineSslUsingAmqpsReturnsStateOfFirstAddress() { + this.properties.setAddresses("amqps://root:password@otherhost,amqp://root:password2@otherhost2"); + assertThat(this.properties.getSsl().determineEnabled()).isTrue(); + } + + @Test + public void determineSslUsingAmqpReturnsStateOfFirstAddress() { + this.properties.setAddresses("amqp://root:password@otherhost,amqps://root:password2@otherhost2"); + assertThat(this.properties.getSsl().determineEnabled()).isFalse(); + } + + @Test + public void determineSslReturnFlagPropertyWhenNoAddresses() { + this.properties.getSsl().setEnabled(true); + assertThat(this.properties.getSsl().determineEnabled()).isTrue(); + } + @Test public void simpleContainerUseConsistentDefaultValues() { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index e89beb2065..8dbb63d29d 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -4762,6 +4762,13 @@ For example, you might declare the following section in `application.properties` spring.rabbitmq.password=secret ---- +Alternatively, you could configure the same connection using the `addresses` attributes: + +[source,properties,indent=0] +---- + spring.rabbitmq.addresses=amqp://admin:secret@localhost +---- + If a `ConnectionNameStrategy` bean exists in the context, it will be automatically used to name connections created by the auto-configured `ConnectionFactory`. See {spring-boot-autoconfigure-module-code}/amqp/RabbitProperties.java[`RabbitProperties`] for more of the supported options.