文章目录
- 前言
- 1. 发送消息的方式
- 2. 配置和依赖
- 3. 发送普通消息
- 3.1 发送同步消息
- 3.2 发送异步消息
- 3.3 单向异步消息
- 4. 顺序消息
- 4.1 发送单向顺序消息
- 4.2 同步顺序消息和异步顺序消息
前言
RocketMQ发送不同的普通消息和顺序消息。
1. 发送消息的方式
RocketMQ提供了三种方式发送普通消息:可靠同步发送、可靠异步发送和单向发送。
- 可靠同步发送
同步发送是指消息发送方发出数据后,会在收到接收方发回响应之后才发下一个数据包的通讯方式。
此种方式应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等。 - 可靠异步发送
异步发送是指发送方发送数据后,不等接收方发送响应,接着发送下个数据包的通讯方式。发送方通过回调接口接收服务器响应,并对响应结果进行处理。
异步发送一般用于链路耗时较长,对RT响应时间较为敏感的业务场景,例如用户视频上传后通知启动转码服务,转码完成后通知推送转码结果等。 - 单向发送
单向发送是指发送方只负责发送消息,不等待服务器回应且没有回调函数触发,即只发送请求不等待应答。适用于某些耗时非常短,但对可靠性要求不高的场景,例如日志收集。
2. 配置和依赖
- 引入依赖
接下来RocketMQ单元测试需要引用的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-spring-boot-starter -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
- 配置rocketmq
rocketmq:
name-server: localhost:9876
producer:
group: group_rocketmq #需要指定默认的组名
3. 发送普通消息
3.1 发送同步消息
对于同步消息,我们可以获取到发送结果。
@RunWith(SpringRunner.class)
@SpringBootTest
public class MessageTypeTest {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Test
public void testSyncSend(){
SendResult result = rocketMQTemplate.syncSend("topic-1", "同步测试消息", 10000);
System.out.println(result);
}
}
运行测试用例,查看RocketMq-console控制台。
添加tag标签
SendResult result = rocketMQTemplate.syncSend("topic-1:mytag", "同步测试消息", 10000);
3.2 发送异步消息
发送异步消息,通过回调方式获取发送结果。
@Test
public void testAsyncSend() throws Exception {
rocketMQTemplate.asyncSend("topic-1:mytag", "异步测试消息", new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("成功回调消息");
System.out.println(sendResult);
}
@Override
public void onException(Throwable throwable) {
System.out.println("回调发生异常了");
System.out.println(throwable);
}
});
System.out.println("-----------------");
TimeUnit.SECONDS.sleep(300);//避免主线程死掉无法获取回调结果
}
运行测试用例
3.3 单向异步消息
直接发送消息,不等待结果,不保证消息一定送达,不回调。
@Test
public void testSendOneWay(){
//不回调,不等待
rocketMQTemplate.sendOneWay("topic-1:mytag","异步单向消息");
}
运行测试用例
4. 顺序消息
我们查看前面已经发送的普通消息(主题topic-1),可以看到它有4个队列,消费者在消费时就没办法保证消息的顺序性。
4.1 发送单向顺序消息
通过sendOneWayOrderly方法,将消息发送到同一个队列,即可实现消息的顺序性。
@Test
public void testSendOneWayOrderly(){
for (int i=0;i<10;i++){
//第三个参数的作用是用来决定这些消息发送到哪个队列
rocketMQTemplate.sendOneWayOrderly("topic-1","异步单向顺序消息","xx");
}
}
运行发送消息后,查看RocketMq-console控制台,可以看到消息进入了同一个队列。
4.2 同步顺序消息和异步顺序消息
同理,同步和异步的消息发送也提供了顺序发送的API,使用方式完全一样。