Skip to content

Commit 6363090

Browse files
committed
refactor: 优化 RabbitAutoConfig 配置
1 parent 4d278bb commit 6363090

1 file changed

Lines changed: 68 additions & 46 deletions

File tree

common/plugin/mq/src/main/java/com/github/cadecode/uniboot/common/plugin/mq/config/RabbitAutoConfig.java

Lines changed: 68 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
2626
import org.springframework.boot.context.properties.bind.BindResult;
2727
import org.springframework.boot.context.properties.bind.Binder;
2828
import org.springframework.context.EnvironmentAware;
29+
import org.springframework.context.annotation.Bean;
2930
import org.springframework.context.annotation.Configuration;
3031
import org.springframework.context.annotation.DependsOn;
3132
import org.springframework.core.env.Environment;
32-
import org.springframework.stereotype.Component;
3333

3434
import java.util.Map;
3535

@@ -40,65 +40,91 @@
4040
* @since 2023/8/17
4141
*/
4242
@Slf4j
43-
@RequiredArgsConstructor
4443
@EnableConfigurationProperties(RabbitProperties.class)
4544
@Configuration
4645
@ConditionalOnProperty(name = "uni-boot.mq.rabbit.enable", havingValue = "true")
47-
public class RabbitAutoConfig implements InitializingBean {
48-
49-
private final MessageConverter messageConverter;
50-
private final MultiRabbitProperties multiRabbitProperties;
51-
private final SimpleRoutingConnectionFactory multiRabbitConnectionFactory;
52-
private final Map<String, SimpleRabbitListenerContainerFactory> rabbitListenerContainerFactoryMap;
46+
public class RabbitAutoConfig {
47+
48+
@Bean
49+
public MultiRabbitContainerFactoryConfig multiRabbitContainerFactoryConfig(MessageConverter messageConverter,
50+
MultiRabbitProperties multiRabbitProperties,
51+
SimpleRoutingConnectionFactory multiRabbitConnectionFactory,
52+
Map<String, SimpleRabbitListenerContainerFactory> rabbitListenerContainerFactoryMap) {
53+
return new MultiRabbitContainerFactoryConfig(messageConverter, multiRabbitProperties, multiRabbitConnectionFactory, rabbitListenerContainerFactoryMap);
54+
}
5355

54-
@Override
55-
public void afterPropertiesSet() {
56-
configureContainerFactory();
56+
@Bean
57+
public MultiRabbitDeclareBeanFactoryPostProcessor multiRabbitDeclareBeanFactoryPostProcessor() {
58+
return new MultiRabbitDeclareBeanFactoryPostProcessor();
5759
}
5860

59-
/**
60-
* 配置 SimpleRabbitListenerContainerFactory
61-
* spring-multirabbit {@link org.springframework.boot.autoconfigure.amqp.MultiRabbitAutoConfiguration}
62-
* 自动配置 SimpleRabbitListenerContainerFactory, 部分配置有缺失,此方法用于补偿
63-
* 参考 {@link SimpleRabbitListenerContainerFactoryConfigurer}
64-
*/
65-
private void configureContainerFactory() {
66-
multiRabbitProperties.getConnections().forEach((connectionName, props) -> {
67-
MultiRabbitContainerFactoryConfigurer configurer = new MultiRabbitContainerFactoryConfigurer(props.getListener().getSimple());
68-
configurer.setMessageConverter(messageConverter);
69-
SimpleRabbitListenerContainerFactory containerFactory = rabbitListenerContainerFactoryMap.get(connectionName);
70-
ConnectionFactory targetConnectionFactory = multiRabbitConnectionFactory.getTargetConnectionFactory(connectionName);
71-
configurer.configure(containerFactory, targetConnectionFactory);
72-
});
61+
@DependsOn(MultiRabbitConstants.CONNECTION_FACTORY_BEAN_NAME)
62+
@Bean
63+
public MultiRabbitContainerBeanPostProcessor multiRabbitContainerBeanPostProcessor() {
64+
return new MultiRabbitContainerBeanPostProcessor();
7365
}
7466

7567
/**
76-
* MultiRabbit ContainerFactory 配置器
68+
* RabbitMQ ContainerFactory 配置
69+
* 提供对 MultiRabbit 支持
7770
*/
7871
@RequiredArgsConstructor
79-
private static class MultiRabbitContainerFactoryConfigurer
80-
extends AbstractRabbitListenerContainerFactoryConfigurer<SimpleRabbitListenerContainerFactory> {
72+
public static class MultiRabbitContainerFactoryConfig implements InitializingBean {
8173

82-
private final org.springframework.boot.autoconfigure.amqp.RabbitProperties.SimpleContainer config;
74+
private final MessageConverter messageConverter;
75+
private final MultiRabbitProperties multiRabbitProperties;
76+
private final SimpleRoutingConnectionFactory multiRabbitConnectionFactory;
77+
private final Map<String, SimpleRabbitListenerContainerFactory> rabbitListenerContainerFactoryMap;
8378

8479
@Override
85-
public void configure(SimpleRabbitListenerContainerFactory factory, ConnectionFactory connectionFactory) {
86-
PropertyMapper map = PropertyMapper.get();
87-
configure(factory, connectionFactory, config);
88-
map.from(config::getConcurrency).whenNonNull().to(factory::setConcurrentConsumers);
89-
map.from(config::getMaxConcurrency).whenNonNull().to(factory::setMaxConcurrentConsumers);
90-
map.from(config::getBatchSize).whenNonNull().to(factory::setBatchSize);
91-
map.from(config::isConsumerBatchEnabled).to(factory::setConsumerBatchEnabled);
80+
public void afterPropertiesSet() {
81+
configureContainerFactory();
9282
}
9383

94-
@Override
95-
public void setMessageConverter(MessageConverter messageConverter) {
96-
super.setMessageConverter(messageConverter);
84+
/**
85+
* 配置 SimpleRabbitListenerContainerFactory
86+
* spring-multirabbit {@link org.springframework.boot.autoconfigure.amqp.MultiRabbitAutoConfiguration}
87+
* 自动配置 SimpleRabbitListenerContainerFactory, 部分配置有缺失,此方法用于补偿
88+
* 参考 {@link SimpleRabbitListenerContainerFactoryConfigurer}
89+
*/
90+
private void configureContainerFactory() {
91+
multiRabbitProperties.getConnections().forEach((connectionName, props) -> {
92+
MultiRabbitContainerFactoryConfigurer configurer = new MultiRabbitContainerFactoryConfigurer(props.getListener().getSimple());
93+
configurer.setMessageConverter(messageConverter);
94+
SimpleRabbitListenerContainerFactory containerFactory = rabbitListenerContainerFactoryMap.get(connectionName);
95+
ConnectionFactory targetConnectionFactory = multiRabbitConnectionFactory.getTargetConnectionFactory(connectionName);
96+
configurer.configure(containerFactory, targetConnectionFactory);
97+
});
9798
}
9899

99-
@Override
100-
public void setMessageRecoverer(MessageRecoverer messageRecoverer) {
101-
super.setMessageRecoverer(messageRecoverer);
100+
/**
101+
* MultiRabbit ContainerFactory 配置器
102+
*/
103+
@RequiredArgsConstructor
104+
private static class MultiRabbitContainerFactoryConfigurer
105+
extends AbstractRabbitListenerContainerFactoryConfigurer<SimpleRabbitListenerContainerFactory> {
106+
107+
private final org.springframework.boot.autoconfigure.amqp.RabbitProperties.SimpleContainer config;
108+
109+
@Override
110+
public void configure(SimpleRabbitListenerContainerFactory factory, ConnectionFactory connectionFactory) {
111+
PropertyMapper map = PropertyMapper.get();
112+
configure(factory, connectionFactory, config);
113+
map.from(config::getConcurrency).whenNonNull().to(factory::setConcurrentConsumers);
114+
map.from(config::getMaxConcurrency).whenNonNull().to(factory::setMaxConcurrentConsumers);
115+
map.from(config::getBatchSize).whenNonNull().to(factory::setBatchSize);
116+
map.from(config::isConsumerBatchEnabled).to(factory::setConsumerBatchEnabled);
117+
}
118+
119+
@Override
120+
public void setMessageConverter(MessageConverter messageConverter) {
121+
super.setMessageConverter(messageConverter);
122+
}
123+
124+
@Override
125+
public void setMessageRecoverer(MessageRecoverer messageRecoverer) {
126+
super.setMessageRecoverer(messageRecoverer);
127+
}
102128
}
103129
}
104130

@@ -107,8 +133,6 @@ public void setMessageRecoverer(MessageRecoverer messageRecoverer) {
107133
* 注入的 bean 名称格式为 connectionName_declareName
108134
* 使用 {@link org.springframework.amqp.core.Declarable} setAdminsThatShouldDeclare 方法指定 AmqpAdmin bean
109135
*/
110-
@Component
111-
@ConditionalOnProperty(name = "uni-boot.mq.rabbit.enable", havingValue = "true")
112136
public static class MultiRabbitDeclareBeanFactoryPostProcessor implements BeanFactoryPostProcessor, EnvironmentAware {
113137
private Environment environment;
114138

@@ -176,8 +200,6 @@ public String getAdminBeanName(String connectionName) {
176200
* 导致 getBean 获取对应 RabbitAdmin 实例失败
177201
* 此处使用 @DependsOn 使 multiRabbitConnectionFactory 提前加载
178202
*/
179-
@DependsOn(MultiRabbitConstants.CONNECTION_FACTORY_BEAN_NAME)
180-
@Component
181203
public static class MultiRabbitContainerBeanPostProcessor implements BeanPostProcessor {
182204

183205
}

0 commit comments

Comments
 (0)