Merge branch '3.2.x' into 3.3.x

Closes gh-42490
This commit is contained in:
Andy Wilkinson 2024-10-01 17:22:11 +01:00
commit 26d3b845c5
2 changed files with 75 additions and 19 deletions

View File

@ -68,9 +68,9 @@ class RabbitStreamConfiguration {
@Bean(name = "rabbitStreamEnvironment")
@ConditionalOnMissingBean(name = "rabbitStreamEnvironment")
Environment rabbitStreamEnvironment(RabbitProperties properties,
Environment rabbitStreamEnvironment(RabbitProperties properties, RabbitConnectionDetails connectionDetails,
ObjectProvider<EnvironmentBuilderCustomizer> customizers) {
EnvironmentBuilder builder = configure(Environment.builder(), properties);
EnvironmentBuilder builder = configure(Environment.builder(), properties, connectionDetails);
customizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
return builder.build();
}
@ -99,18 +99,29 @@ class RabbitStreamConfiguration {
return template;
}
static EnvironmentBuilder configure(EnvironmentBuilder builder, RabbitProperties properties) {
static EnvironmentBuilder configure(EnvironmentBuilder builder, RabbitProperties properties,
RabbitConnectionDetails connectionDetails) {
return configure(builder, properties.getStream(), connectionDetails);
}
private static EnvironmentBuilder configure(EnvironmentBuilder builder, RabbitProperties.Stream stream,
RabbitConnectionDetails connectionDetails) {
builder.lazyInitialization(true);
RabbitProperties.Stream stream = properties.getStream();
PropertyMapper map = PropertyMapper.get();
map.from(stream.getHost()).to(builder::host);
map.from(stream.getPort()).to(builder::port);
map.from(stream.getVirtualHost())
.as(withFallback(properties::getVirtualHost))
.as(withFallback(connectionDetails::getVirtualHost))
.whenNonNull()
.to(builder::virtualHost);
map.from(stream.getUsername()).as(withFallback(properties::getUsername)).whenNonNull().to(builder::username);
map.from(stream.getPassword()).as(withFallback(properties::getPassword)).whenNonNull().to(builder::password);
map.from(stream.getUsername())
.as(withFallback(connectionDetails::getUsername))
.whenNonNull()
.to(builder::username);
map.from(stream.getPassword())
.as(withFallback(connectionDetails::getPassword))
.whenNonNull()
.to(builder::password);
return builder;
}

View File

@ -17,6 +17,7 @@
package org.springframework.boot.autoconfigure.amqp;
import java.time.Duration;
import java.util.List;
import com.rabbitmq.stream.BackOffDelayPolicy;
import com.rabbitmq.stream.Codec;
@ -124,12 +125,14 @@ class RabbitStreamConfigurationTests {
}
@Test
void environmentUsesPropertyDefaultsByDefault() {
void environmentUsesConnectionDetailsByDefault() {
EnvironmentBuilder builder = mock(EnvironmentBuilder.class);
RabbitProperties properties = new RabbitProperties();
RabbitStreamConfiguration.configure(builder, properties);
RabbitStreamConfiguration.configure(builder, properties,
new TestRabbitConnectionDetails("guest", "guest", "vhost"));
then(builder).should().port(5552);
then(builder).should().host("localhost");
then(builder).should().virtualHost("vhost");
then(builder).should().lazyInitialization(true);
then(builder).should().username("guest");
then(builder).should().password("guest");
@ -141,7 +144,8 @@ class RabbitStreamConfigurationTests {
EnvironmentBuilder builder = mock(EnvironmentBuilder.class);
RabbitProperties properties = new RabbitProperties();
properties.getStream().setPort(5553);
RabbitStreamConfiguration.configure(builder, properties);
RabbitStreamConfiguration.configure(builder, properties,
new TestRabbitConnectionDetails("guest", "guest", "vhost"));
then(builder).should().port(5553);
}
@ -150,7 +154,8 @@ class RabbitStreamConfigurationTests {
EnvironmentBuilder builder = mock(EnvironmentBuilder.class);
RabbitProperties properties = new RabbitProperties();
properties.getStream().setHost("stream.rabbit.example.com");
RabbitStreamConfiguration.configure(builder, properties);
RabbitStreamConfiguration.configure(builder, properties,
new TestRabbitConnectionDetails("guest", "guest", "vhost"));
then(builder).should().host("stream.rabbit.example.com");
}
@ -159,7 +164,8 @@ class RabbitStreamConfigurationTests {
EnvironmentBuilder builder = mock(EnvironmentBuilder.class);
RabbitProperties properties = new RabbitProperties();
properties.getStream().setVirtualHost("stream-virtual-host");
RabbitStreamConfiguration.configure(builder, properties);
RabbitStreamConfiguration.configure(builder, properties,
new TestRabbitConnectionDetails("guest", "guest", "vhost"));
then(builder).should().virtualHost("stream-virtual-host");
}
@ -167,20 +173,22 @@ class RabbitStreamConfigurationTests {
void whenStreamVirtualHostIsNotSetButDefaultVirtualHostIsSetThenEnvironmentUsesDefaultVirtualHost() {
EnvironmentBuilder builder = mock(EnvironmentBuilder.class);
RabbitProperties properties = new RabbitProperties();
properties.setVirtualHost("default-virtual-host");
RabbitStreamConfiguration.configure(builder, properties);
properties.setVirtualHost("properties-virtual-host");
RabbitStreamConfiguration.configure(builder, properties,
new TestRabbitConnectionDetails("guest", "guest", "default-virtual-host"));
then(builder).should().virtualHost("default-virtual-host");
}
@Test
void whenStreamCredentialsAreNotSetThenEnvironmentUsesRabbitCredentials() {
void whenStreamCredentialsAreNotSetThenEnvironmentUsesConnectionDetailsCredentials() {
EnvironmentBuilder builder = mock(EnvironmentBuilder.class);
RabbitProperties properties = new RabbitProperties();
properties.setUsername("alice");
properties.setPassword("secret");
RabbitStreamConfiguration.configure(builder, properties);
then(builder).should().username("alice");
then(builder).should().password("secret");
RabbitStreamConfiguration.configure(builder, properties,
new TestRabbitConnectionDetails("bob", "password", "vhost"));
then(builder).should().username("bob");
then(builder).should().password("password");
}
@Test
@ -191,7 +199,8 @@ class RabbitStreamConfigurationTests {
properties.setPassword("secret");
properties.getStream().setUsername("bob");
properties.getStream().setPassword("confidential");
RabbitStreamConfiguration.configure(builder, properties);
RabbitStreamConfiguration.configure(builder, properties,
new TestRabbitConnectionDetails("charlotte", "hidden", "vhost"));
then(builder).should().username("bob");
then(builder).should().password("confidential");
}
@ -345,4 +354,40 @@ class RabbitStreamConfigurationTests {
}
private static final class TestRabbitConnectionDetails implements RabbitConnectionDetails {
private final String username;
private final String password;
private final String virtualHost;
private TestRabbitConnectionDetails(String username, String password, String virtualHost) {
this.username = username;
this.password = password;
this.virtualHost = virtualHost;
}
@Override
public String getUsername() {
return this.username;
}
@Override
public String getPassword() {
return this.password;
}
@Override
public String getVirtualHost() {
return this.virtualHost;
}
@Override
public List<Address> getAddresses() {
throw new UnsupportedOperationException();
}
}
}