RocketMQ多数据源的配置,多环境发送消息

摘要:RocketMQ针对不同的环境、不同的IP地址发送Messag消息。本文仅作为消息的生产发送方进行说明。

一、多数据源配置与发送流程

1.1 pom.xml依赖

依赖的version

        <rocketmq-version>4.5.1</rocketmq-version>

引入依赖包

        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>${rocketmq-version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-acl</artifactId>
            <version>${rocketmq-version}</version>
        </dependency>
1.2 properties文件配置数据源

在resources>File>data.properties,创建数据源配置文件,如图。
在这里插入图片描述

1.3 编写一个获取bean的工具类

这一步差点忘了,自己代码写了一个获取Springboot对象的工具类,新建一个SpringContextUtils类。

@Component
public class SpringContextUtils implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtils.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }
}
1.4 编写RocketMQ的配置类

用来读取对应的RocketMQ配置,并在构建阶段实现生产的启动。

@Component
public class RocketMQConfig {

	// 用来获取properties文件中的数据
    private static final ResourceBundle bundle = ResourceBundle.getBundle("data", Locale.CHINA);

    @Resource(name = "TEST1")
    private DefaultMQProducer TEST1;

    @Resource(name = "TEST2")
    private DefaultMQProducer TEST2;

	// 根据生产者名称获取对应的produce
    public static DefaultMQProducer getProducerByName(String producerName) {
        return (DefaultMQProducer) SpringContextUtils.getBean(producerName);
    }

    @Bean(name = "TEST1")
    public DefaultMQProducer TEST1() {
        DefaultMQProducer producer = new DefaultMQProducer();
        producer.setNamesrvAddr(bundle.getString("TEST1_ROCKETMQ_ADDRESS"));
        producer.setProducerGroup("rocketmq_TEST1");
        producer.setClientIP("client_test1");	// 保证不一致
        try {
        	// 启动produce,若不启动或者重复启动则会抛出
            producer.start();
        } catch (MQClientException e) {
            e.printStackTrace();
        }

        return producer;
    }

    @Bean(name = "TEST2")
    public DefaultMQProducer TEST2() {
        DefaultMQProducer producer = new DefaultMQProducer();
        producer.setNamesrvAddr(bundle.getString("TEST2_ROCKETMQ_ADDRESS"));
        producer.setProducerGroup("rocketmq_TEST2");
        producer.setClientIP("client_test2");	// 保证不一致
        try {
            producer.start();
        } catch (MQClientException e) {
            e.printStackTrace();
        }

        return producer;
    }
}
1.5 调用代码
    @Override
    public boolean sendMessage(String MQName, String topic, String messageBody) {
    	// 即根据名称去获取TEST1、TEST2的produce
        DefaultMQProducer producer = RocketMQConfig.getProducerByName(MQName);
        try {
            SendResult sendResult = producer.send(new Message(topic, messageBody.getBytes()));
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

就已经实现了一个根据配置文件,对多个MQ数据源发送消息的逻辑。
可以去自带的RockeMQ的控制台,查看消息发送的结果。

1.6 搞个测试类或者直接调用

调用sendMessage方法,搞定

可以一键三连,关注、收藏、点赞走一波了~


二、 解读

2.1 Producer启动之后会挂掉么?

Producer挂掉,MQ其实就挂掉了,底层是通过保持一个MQ服务器长连接来实现的,一般不会挂。

2.2 配置类的简单实现思路
  • @Bean和@Resource初始化的过程中将对应的实例加载进来,同时将对应的生产者启动;
  • @Component声明为容器组件,初始化Springboot时自动加载;

所以在springboot启动之后,对应的组件和对象便可以调用。

2.3 RocketMQTemplate如何进行多源发送?

先放上依赖,源码还没看,回来抽空看看【TODO】

        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>${rocketmq.boot.version}</version>
        </dependency>

可以进行关注点赞收藏,UUT持续更新优质内容~

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂点engineer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值