手工注册rabbitmq的消费者

正常的配置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版权协议,转载请附上原文出处链接和本声明。