支持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;

写在后面

相关推荐
洛豳枭薰11 小时前
消息队列关键问题描述
kafka·rabbitmq·rocketmq
闻哥20 小时前
Kafka高吞吐量核心揭秘:四大技术架构深度解析
java·jvm·面试·kafka·rabbitmq·springboot
creator_Li2 天前
RabbitMQ示例
rabbitmq
惊讶的猫2 天前
rabbitmq实践小案例
分布式·rabbitmq
AC赳赳老秦2 天前
代码生成超越 GPT-4:DeepSeek-V4 编程任务实战与 2026 开发者效率提升指南
数据库·数据仓库·人工智能·科技·rabbitmq·memcache·deepseek
惊讶的猫2 天前
rabbitmq初步介绍
分布式·rabbitmq
惊讶的猫2 天前
AMQP 与 RabbitMQ 四大模型
分布式·rabbitmq
像少年啦飞驰点、2 天前
从零开始学 RabbitMQ:小白也能懂的消息队列实战指南
java·spring boot·微服务·消息队列·rabbitmq·异步编程
lekami_兰2 天前
RabbitMQ 延迟队列实现指南:两种方案手把手教你搞定
后端·rabbitmq·延迟队列
为什么不问问神奇的海螺呢丶2 天前
n9e categraf rabbitmq监控配置
分布式·rabbitmq·ruby