正常的配置rabbitmq消费者
@Bean
SimpleMessageListenerContainer createSimpleMessageListenerContainer(Queue omsQueue,ConnectionFactory connectionFactory,RabbitTransactionManager rabbitProducerTxManager,CommonMessageConsumer commonMessageConsumer){
SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer(connectionFactory);
simpleMessageListenerContainer.setAcknowledgeMode(AcknowledgeMode.MANUAL);
simpleMessageListenerContainer.setQueueNames(omsQueue.getName());
simpleMessageListenerContainer.setMessageListener(commonMessageConsumer);
return simpleMessageListenerContainer;
}
但是在特殊情况下需要手工注册消费者.比如说在本地调试生产环境的mq消息时,我们并不想监听mq消息队列.所以这时候不能用@Bean注解注册mq消费者.采用系统变量结合ApplicationListener来控制是否注册mq消费者.
package com.itl.wms.webutil;
import com.itl.core.StringUtils;
import com.itl.wms.mvc.common.CommonMessageConsumer;
import com.itl.wms.service.enumtype.mq.MQOnOffStatusEnum;
import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import org.springframework.web.context.support.XmlWebApplicationContext;
@Component
public class BeanDefineConfigue implements ApplicationListener<ApplicationEvent> {
private static final String MQ_ONOFF = "mq.onoff";
//为了控制spring容器和spring mvc容器调用两次
public static boolean registerFlag = false;
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent){
String mqOnoffParams = StringUtils.isEmpty(System.getProperty(MQ_ONOFF)) ? "" : System.getProperty(MQ_ONOFF);
MQOnOffStatusEnum mqOnOffStatusEnum = MQOnOffStatusEnum.findTypeByCode(mqOnoffParams);
if (mqOnOffStatusEnum.equals(MQOnOffStatusEnum.MQ_ON)) {
//注册bean
XmlWebApplicationContext applicationContext = (XmlWebApplicationContext) ((ContextRefreshedEvent) event).getApplicationContext();
ConfigurableListableBeanFactory beanFactory = applicationContext.getBeanFactory();
if (!registerFlag){
beanFactory.registerSingleton("simpleMessageListenerContainer",createSimpleMessageListenerContainer(beanFactory.getBean(Queue.class)
,beanFactory.getBean(CachingConnectionFactory.class),beanFactory.getBean(CommonMessageConsumer.class)));
registerFlag = true;
}
}
}
}
private SimpleMessageListenerContainer createSimpleMessageListenerContainer(Queue omsQueue, ConnectionFactory connectionFactory, CommonMessageConsumer commonMessageConsumer){
SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer(connectionFactory);
simpleMessageListenerContainer.setAcknowledgeMode(AcknowledgeMode.MANUAL);
simpleMessageListenerContainer.setQueueNames(omsQueue.getName());
simpleMessageListenerContainer.setMessageListener(commonMessageConsumer);
simpleMessageListenerContainer.start();
return simpleMessageListenerContainer;
}
}
注意手动注册于@Bean注册的不同在于simpleMessageListenerContainer.start();
手工注册如果没有这一行代码是不会创建与rabbitmq服务的连接的,@Bean具体在哪里执行没有查找.
版权声明:本文为weixin_42989402原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。