Allow auto-configured Rabbit Stream Environment to be customized

Closes gh-32580
pull/32585/head
Andy Wilkinson 2 years ago
parent 0ae7e935c3
commit 5199ffe6a9

@ -0,0 +1,38 @@
/*
* Copyright 2012-2022 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.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.amqp;
import com.rabbitmq.stream.Environment;
import com.rabbitmq.stream.EnvironmentBuilder;
/**
* Callback interface that can be implemented by beans wishing to customize the
* auto-configured {@link Environment} that is created by an {@link EnvironmentBuilder}.
*
* @author Andy Wilkinson
* @since 3.0.0
*/
@FunctionalInterface
public interface EnvironmentBuilderCustomizer {
/**
* Customize the {@code EnvironmentBuilder}.
* @param builder the builder to customize
*/
void customize(EnvironmentBuilder builder);
}

@ -65,8 +65,11 @@ class RabbitStreamConfiguration {
@Bean(name = "rabbitStreamEnvironment")
@ConditionalOnMissingBean(name = "rabbitStreamEnvironment")
Environment rabbitStreamEnvironment(RabbitProperties properties) {
return configure(Environment.builder(), properties).build();
Environment rabbitStreamEnvironment(RabbitProperties properties,
ObjectProvider<EnvironmentBuilderCustomizer> customizers) {
EnvironmentBuilder builder = configure(Environment.builder(), properties);
customizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
return builder.build();
}
@Bean

@ -16,6 +16,10 @@
package org.springframework.boot.autoconfigure.amqp;
import java.time.Duration;
import com.rabbitmq.stream.BackOffDelayPolicy;
import com.rabbitmq.stream.Codec;
import com.rabbitmq.stream.Environment;
import com.rabbitmq.stream.EnvironmentBuilder;
import org.assertj.core.api.InstanceOfAssertFactories;
@ -32,6 +36,7 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.annotation.Order;
import org.springframework.rabbit.stream.config.StreamRabbitListenerContainerFactory;
import org.springframework.rabbit.stream.listener.ConsumerCustomizer;
import org.springframework.rabbit.stream.listener.StreamListenerContainer;
@ -209,6 +214,17 @@ class RabbitStreamConfigurationTests {
});
}
@Test
void environmentCreatedByBuilderCanBeCustomized() {
this.contextRunner.withUserConfiguration(EnvironmentBuilderCustomizers.class).run((context) -> {
Environment environment = context.getBean(Environment.class);
assertThat(environment).extracting("codec")
.isEqualTo(context.getBean(EnvironmentBuilderCustomizers.class).codec);
assertThat(environment).extracting("recoveryBackOffDelayPolicy")
.isEqualTo(context.getBean(EnvironmentBuilderCustomizers.class).recoveryBackOffDelayPolicy);
});
}
@Configuration(proxyBeanMethods = false)
static class TestConfiguration {
@ -272,4 +288,26 @@ class RabbitStreamConfigurationTests {
}
@Configuration(proxyBeanMethods = false)
static class EnvironmentBuilderCustomizers {
private final Codec codec = mock(Codec.class);
private final BackOffDelayPolicy recoveryBackOffDelayPolicy = BackOffDelayPolicy.fixed(Duration.ofSeconds(5));
@Bean
@Order(1)
EnvironmentBuilderCustomizer customizerA() {
return (builder) -> builder.codec(this.codec);
}
@Bean
@Order(0)
EnvironmentBuilderCustomizer customizerB() {
return (builder) -> builder.codec(mock(Codec.class))
.recoveryBackOffDelayPolicy(this.recoveryBackOffDelayPolicy);
}
}
}

Loading…
Cancel
Save