摘要: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持续更新优质内容~