支持rabbitmq多数据源

写在前面

本文看下如何配置rabbitmq多数据源(生产者和消费者)。

1:正文

在springboot环境下,基于自动配置,只配置一个是很简答的,像这样就行:

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>


spring:
  rabbitmq:
    host: 10.150.30.43
    port: 5672
    username: dixxxg
    password: dixxx
    virtual-host: dialog_vhost
    connection-timeout: 15000
    listener:
      simple:
        acknowledge-mode: auto  # 自动ack
        retry:
          enabled: true
          max-attempts: 5
          max-interval: 60000   # 重试最大间隔时间
          initial-interval: 5000  # 重试初始间隔时间
          multiplier: 2 # 间隔时间乘子,间隔时间*乘子=下一次的间隔时间,最大不能超过设置的最大间隔时间

这样就会自动注入创建org.springframework.amqp.rabbit.core.RabbitTemplate类,但是如果需要第二个,就稍微费点功夫了,但也不复杂,首先当然也是配置要连接的mq地址(这个就没有格式要求了,自己能取到就行)。

1.1:多数据源消费者

配置文件:

复制代码
nonlivingcheck:
  rabbitmq:
    host: ***
    port: 5672
    username: di***g
    password: Yan****123
    connection-timeout: 15000
    virtual-host: dialog_vhost

接着如下方式代码手动配置方式绑定交换机,创建队列等:

java 复制代码
@Bean
public SimpleMessageListenerContainer orderQueueListenerContainer(@Value("${nonlivingcheck.rabbitmq.host}") String host,
                                                                  @Value("${nonlivingcheck.rabbitmq.port}") int port,
                                                                  @Value("${nonlivingcheck.rabbitmq.username}") String username,
                                                                  @Value("${nonlivingcheck.rabbitmq.password}") String password,
                                                                  @Value("${nonlivingcheck.rabbitmq.virtual-host}") String virtualHost) {
    log.info("create nonliving check configuration begin");
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
    connectionFactory.setHost(host);
    connectionFactory.setPort(port);
    connectionFactory.setUsername(username);
    connectionFactory.setPassword(password);
    connectionFactory.setVirtualHost(virtualHost);
    // 2. 创建 RabbitAdmin 用于声明组件
    RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    // 1:定义队列和交换机,并声明
    TopicExchange topicExchange = new TopicExchange("asv.exchange", true, false);
    rabbitAdmin.declareExchange(topicExchange);
    Queue nonlivingQueue = new Queue(NONLIVING_QUEUE_NAME, true, false, true);
    log.info("automatically create queue: [{}] in vhost: [{}], exchanger: [asv.exchange]", NONLIVING_QUEUE_NAME, virtualHost);
    rabbitAdmin.declareQueue(nonlivingQueue);
    // 队列绑定交换机,并定义routingkey
    Binding binding = BindingBuilder.bind(nonlivingQueue)
            .to(topicExchange)
//                .with("asv.results"); // 精确匹配 user.update
            .with("asv.#");
    rabbitAdmin.declareBinding(binding);
    // 3:关联到container,间接关联到mq connect信息
    container.addQueues(nonlivingQueue);
    container.setMessageListener(new MessageListenerAdapter(topicMessageHandler) {
        {
            setDefaultListenerMethod("handleMessage");
            setMessageConverter(jsonMessageConverter());
        }
    });
    container.setConcurrentConsumers(3);
    container.setMaxConcurrentConsumers(5);
    log.info("congratulation!!! you create nonliving check configuration suc, what a great job done!!!");
    return container;
}

代码:

java 复制代码
container.setMessageListener(new MessageListenerAdapter(topicMessageHandler) {
    {
        setDefaultListenerMethod("handleMessage");
        setMessageConverter(jsonMessageConverter());
    }
});

配置了消息处理类以及对应的方法,这样就会绑定交换机和创建队列了,消息处理器如下:

java 复制代码
@Component
public class NonlivingMessageHandler {
    /**
     * 处理用户相关消息
     * 路由键匹配:user.*
     */
    public void handleMessage(LinkedHashMap message) {
        // 消息处理逻辑
    }
}

这里的消息入参不一定是LinkedHashMap,因为我这里消费的消息是json格式的,如果是你不是可能需要改这里。

1.2:多数据源生产者

相比对数据源消费者,这种方式要简单的多了,首先定义配置文件:

复制代码
outcallrobot:
  rabbitmq:
    host: ***
    port: 5672
    username: ***
    password: ***
    virtual-host: osc

代码:

java 复制代码
@Bean(name = "outcallRobotRabbitTemplate")
public RabbitTemplate firstRabbitTemplate(@Value("${outcallrobot.rabbitmq.host}") String host,
                                          @Value("${outcallrobot.rabbitmq.port}") int port,
                                          @Value("${outcallrobot.rabbitmq.username}") String username,
                                          @Value("${outcallrobot.rabbitmq.password}") String password,
                                          @Value("${outcallrobot.rabbitmq.virtual-host}") String virtualHost) {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
    connectionFactory.setHost(host);
    connectionFactory.setPort(port);
    connectionFactory.setUsername(username);
    connectionFactory.setPassword(password);
    connectionFactory.setVirtualHost(virtualHost);
//        return connectionFactory;
    return new RabbitTemplate(connectionFactory);
}

使用:

java 复制代码
@Resource(name = "outcallRobotRabbitTemplate")
//        @Resource
private RabbitTemplate robotRabbitTemplate;

写在后面

相关推荐
Anastasiozzzz16 小时前
RabbitMQ介绍与基础架构
分布式·rabbitmq
洛阳纸贵16 小时前
JAVA高级工程师--RabbitMQ消息可靠性、若依集成升级
java·rabbitmq·java-rabbitmq
jiayong2316 小时前
MQ性能优化面试题
java·性能优化·kafka·rabbitmq
小北方城市网2 天前
Spring Cloud Gateway 全链路监控与故障自愈实战
spring boot·python·rabbitmq·java-rabbitmq·数据库架构
小北方城市网3 天前
Spring Cloud Gateway 进阶实战:自定义过滤器、动态路由与全链路日志监控
spring boot·python·rabbitmq·java-rabbitmq·数据库架构
Roye_ack3 天前
【微服务 Day6】SpringCloud实战开发(RabbitMQ高级篇 + 死信交换机、延迟消息)
spring cloud·微服务·rabbitmq·mq
不想写bug呀3 天前
RabbitMQ相关问题总结
rabbitmq·工作模式
Knight_AL3 天前
RabbitMQ 中 Ready 和 Unacked 到底是什么意思?如何用它们判断系统是否健康
分布式·rabbitmq
小北方城市网3 天前
Spring Cloud 服务治理实战:构建高可用微服务体系
spring boot·python·rabbitmq·java-rabbitmq·数据库架构
橘橙黄又青4 天前
RabbitMQ篇
分布式·rabbitmq