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

写在后面

相关推荐
让我上个超影吧3 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖3 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
Ronin3054 天前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
2501_941800885 天前
云计算与边缘计算:协同合作助力智慧城市建设
rabbitmq
AlickLbc6 天前
RabbitMQ安装记录
分布式·rabbitmq
pursue.dreams6 天前
Windows 安装 RabbitMQ 保姆级教程
windows·rabbitmq
切糕师学AI7 天前
RabbitMQ 是什么?
微服务·消息队列·rabbitmq
Anastasiozzzz7 天前
解决 RabbitMQ 的可靠性投递与消息重复消费问题思路
分布式·rabbitmq
Ronin3057 天前
订阅者模块
rabbitmq
fchampion7 天前
最终一致性
java·spring·rabbitmq·github·mvc