【Spring boot】配置多个RabbitMQ

1,103 阅读1分钟
@Configuration
public class RabbitmqConfig {


    /**
     * primaryrabbitMQ
     *
     * @return
     */
    @Bean(name = "primaryRabbitTemplate")
    @Primary
    public RabbitTemplate primaryRabbitTemplate(@Qualifier("primaryConnectionFactory") ConnectionFactory connectionFactory) {
        return new RabbitTemplate(connectionFactory);
    }


    @Bean("primaryConnectionFactory")
    @Primary
    public ConnectionFactory innerRabbitConfiguration(@Value("${primary.rabbitmq.host}") String host,
                                                      @Value("${primary.rabbitmq.port}") int port,
                                                      @Value("${primary.rabbitmq.username}") String username,
                                                      @Value("${primary.rabbitmq.password}") String password,
                                                      @Value("${primary.rabbitmq.virtual-host}") String virtualHost) {
        return this.rabbitConnection(host, port, username, password,virtualHost);
    }


    @Bean("primaryRabbitContainerFactory")
    @Primary
    public SimpleRabbitListenerContainerFactory consumeRabbitFactory(
            SimpleRabbitListenerContainerFactoryConfigurer configurer,
            @Qualifier("primaryConnectionFactory") ConnectionFactory connectionFactory) {
        return this.rabbitFactory(configurer, connectionFactory);
    }


    public ConnectionFactory rabbitConnection(String host, int port, String username, String password, String virtualHost) {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost(host);
        connectionFactory.setPort(port);
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        connectionFactory.setVirtualHost(virtualHost);
        return connectionFactory;
    }

    public SimpleRabbitListenerContainerFactory rabbitFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        return factory;
    }
}

注意:如果配置了多个rabbitConnectionFactory,再使用@RabbitListener 监控队列时,必须指定containerFactory,不如会监听容器中的第一个containerFactory

    @RabbitListener(queues = {RabbitmqConstants.QUEUE_NORMAL_FACE, RabbitmqConstants.QUEUE_ALARM_FACE},containerFactory = "primaryRabbitContainerFactory")
    @RabbitHandler
    public void listener(@Payload String msg, Channel channel, Message message) {
        try {
            log.info("queues[{}] receive message [{}] ", message.getMessageProperties().getConsumerQueue(), msg);
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            if (message.getMessageProperties().getRedelivered()) {
                try {
                    channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            } else {
                try {
                    channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            e.printStackTrace();
        }

    }