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

写在后面

相关推荐
哈里谢顿1 天前
《10 分钟上手 RabbitMQ:用 Python 写一个“不丢消息”的迷你消息系统》
rabbitmq
YDS8292 天前
SpringCloud —— RabbitMQ消息队列详解
spring cloud·rabbitmq·java-rabbitmq
java1234_小锋2 天前
RabbitMQ和AMQP是什么关系?
分布式·rabbitmq
vb2008112 天前
基于AMQP协议模拟MQTT的发布 / 订阅主题功能
python·rabbitmq
csdn_aspnet2 天前
在 ASP.NET Core 中发布 RabbitMQ 消息
rabbitmq·.netcore
萧曵 丶2 天前
MQ 业务实际使用与问题处理详解
开发语言·kafka·消息队列·rabbitmq·rocketmq·mq
Noushiki3 天前
RabbitMQ 基础 学习笔记1
笔记·学习·rabbitmq
csdn_aspnet3 天前
在 ASP.NET Core 中使用(消费) RabbitMQ 消息
rabbitmq·.netcore