2626import org .springframework .boot .context .properties .bind .BindResult ;
2727import org .springframework .boot .context .properties .bind .Binder ;
2828import org .springframework .context .EnvironmentAware ;
29+ import org .springframework .context .annotation .Bean ;
2930import org .springframework .context .annotation .Configuration ;
3031import org .springframework .context .annotation .DependsOn ;
3132import org .springframework .core .env .Environment ;
32- import org .springframework .stereotype .Component ;
3333
3434import java .util .Map ;
3535
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