文章目录

  • 前言
  • 1. 发送消息的方式
  • 2. 配置和依赖
  • 3. 发送普通消息
  • 3.1 发送同步消息
  • 3.2 发送异步消息
  • 3.3 单向异步消息
  • 4. 顺序消息
  • 4.1 发送单向顺序消息
  • 4.2 同步顺序消息和异步顺序消息


前言

RocketMQ发送不同的普通消息和顺序消息。

1. 发送消息的方式

RocketMQ提供了三种方式发送普通消息:可靠同步发送、可靠异步发送和单向发送。

  • 可靠同步发送
    同步发送是指消息发送方发出数据后,会在收到接收方发回响应之后才发下一个数据包的通讯方式。
    此种方式应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等。
  • 可靠异步发送
    异步发送是指发送方发送数据后,不等接收方发送响应,接着发送下个数据包的通讯方式。发送方通过回调接口接收服务器响应,并对响应结果进行处理。
    异步发送一般用于链路耗时较长,对RT响应时间较为敏感的业务场景,例如用户视频上传后通知启动转码服务,转码完成后通知推送转码结果等。
  • 单向发送
    单向发送是指发送方只负责发送消息,不等待服务器回应且没有回调函数触发,即只发送请求不等待应答。适用于某些耗时非常短,但对可靠性要求不高的场景,例如日志收集。

2. 配置和依赖

  1. 引入依赖
    接下来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>
  1. 配置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控制台。

springboot rocketmq MQTT协议发送接收消息_rocketmq


springboot rocketmq MQTT协议发送接收消息_System_02

添加tag标签

SendResult result = rocketMQTemplate.syncSend("topic-1:mytag", "同步测试消息", 10000);

springboot rocketmq MQTT协议发送接收消息_发送消息_03


springboot rocketmq MQTT协议发送接收消息_java-rocketmq_04

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);//避免主线程死掉无法获取回调结果
    }

运行测试用例

springboot rocketmq MQTT协议发送接收消息_发送消息_05


springboot rocketmq MQTT协议发送接收消息_架构_06

3.3 单向异步消息

直接发送消息,不等待结果,不保证消息一定送达,不回调。

@Test
    public void testSendOneWay(){
        //不回调,不等待
        rocketMQTemplate.sendOneWay("topic-1:mytag","异步单向消息");
    }

运行测试用例

springboot rocketmq MQTT协议发送接收消息_java-rocketmq_07

springboot rocketmq MQTT协议发送接收消息_发送消息_08

4. 顺序消息

我们查看前面已经发送的普通消息(主题topic-1),可以看到它有4个队列,消费者在消费时就没办法保证消息的顺序性。

springboot rocketmq MQTT协议发送接收消息_rocketmq_09

4.1 发送单向顺序消息

通过sendOneWayOrderly方法,将消息发送到同一个队列,即可实现消息的顺序性。

@Test
    public void testSendOneWayOrderly(){
        for (int i=0;i<10;i++){
            //第三个参数的作用是用来决定这些消息发送到哪个队列
            rocketMQTemplate.sendOneWayOrderly("topic-1","异步单向顺序消息","xx");
        }
    }

运行发送消息后,查看RocketMq-console控制台,可以看到消息进入了同一个队列。

springboot rocketmq MQTT协议发送接收消息_System_10

4.2 同步顺序消息和异步顺序消息

同理,同步和异步的消息发送也提供了顺序发送的API,使用方式完全一样。

springboot rocketmq MQTT协议发送接收消息_架构_11