All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.luues.rabbitmq.config.RabbitMQConfiguration Maven / Gradle / Ivy

package com.luues.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.transaction.RabbitTransactionManager;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class RabbitMQConfiguration {

    @Autowired(required = false)
    private RabbitProducerConfig rabbitProducerConfig;

    @Bean(value = "officialRabbitTemplate")
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(rabbitmqconnectionFactory());
        rabbitTemplate.setMessageConverter(jsonMessageConverter());
        // 消息是否成功发送到Exchange
        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
            if (ack) {
                //LogUtil.info("消息成功发送到Exchange!");
            } else {
                //LogUtil.error("消息发送到Exchange失败, {}, cause: {}", correlationData, cause);
            }
        });
        rabbitTemplate.setMandatory(true);
        rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
            //LogUtil.error("消息从Exchange路由到Queue失败: exchange: {}, route: {}, replyCode: {}, replyText: {}, message: {}", exchange, routingKey, replyCode, replyText, message);
        });
        return rabbitTemplate;
    }

    // 初始化连接
    @Bean
    public ConnectionFactory rabbitmqconnectionFactory() {
        CachingConnectionFactory factory = new CachingConnectionFactory();
        factory.setHost(rabbitProducerConfig.getHost());
        factory.setPort(rabbitProducerConfig.getPort());
        factory.setUsername(rabbitProducerConfig.getUsername());
        factory.setPassword(rabbitProducerConfig.getPassword());
        //factory.setPublisherConfirms(true);
        //factory.setPublisherReturns(true);
        /*factory.setChannelCacheSize(100);
        factory.setCacheMode(CachingConnectionFactory.CacheMode.CHANNEL);*/
        return factory;
    }

    /**
     * 配置启用rabbitmq事务
     * @return
     */
    @Bean
    public RabbitTransactionManager rabbitTransactionManager() {
        RabbitTransactionManager transactionManager = new RabbitTransactionManager(rabbitmqconnectionFactory());
        return transactionManager;
    }

    @Bean
    public RabbitAdmin rabbitAdmin() {
        return new RabbitAdmin(rabbitmqconnectionFactory());
    }

    /*@Bean
    public SimpleMessageListenerContainer simpleMessageListenerContainer(){
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory());
        container.setExposeListenerChannel(true);
        container.addQueues(RabbitMQQueueEnum.getQueues());
        container.setAmqpAdmin(rabbitAdmin());
        container.setAcknowledgeMode(AcknowledgeMode.MANUAL);
        container.setConcurrentConsumers(1);
        container.setMaxConcurrentConsumers(1);
        container.setMessageListener(rabbitMQDefaultListener);
        return container;
    }*/

    @Bean
    @Qualifier(value = QueueConstant.MANUAL)
    public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(rabbitmqconnectionFactory());
        //开启手动 ack,测试一个消息被Consumer拒收了,并且reject方法的参数里requeue是false。也就是说不会被再次放在队列里,被其他消费者使用
        factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
        //配置消息转化器,如果需要在消息通道channel中传输可序列化对象,需要此配置
        factory.setMessageConverter(jsonMessageConverter());
        return factory;
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy