RocketMQ学习笔记(三)

本文介绍了如何在SpringBoot项目中集成RocketMQ,包括基本配置、发送同步异步消息、一次性消息、广播消费、延时消息、Tag消息过滤、SQL消息过滤、顺序消息以及死信队列的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集成SpringBoot

基础配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.rocketmq</groupId>
        <artifactId>rocketmq-spring-boot-starter</artifactId>
        <version>2.2.3</version>
    </dependency>
</dependencies>

发送同步消息

配置

rocketmq.name-server=localhost:9876
rocketmq.producer.group=my-group

发送同步消息

@Resource
private RocketMQTemplate rocketMQTemplate;

@Test
public void testSendSyncMsg(){
    String topic = "helloTopic";
    Message<String> message = MessageBuilder.withPayload("发送同步消息").build();
    rocketMQTemplate.syncSend(topic,message);
}

消费消息

import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;

@Component
@RocketMQMessageListener(consumerGroup = "helloTopicGroup",topic = "helloTopic")
public class HelloListener implements RocketMQListener<MessageExt> {
    @Override
    public void onMessage(MessageExt messageExt) {
        System.out.println("消息内容为===>"+new String(messageExt.getBody()));
    }
}

发送异步消息

@Test
public void testSendASyncMsg() {
    String topic = "helloTopic";
    Message<String> message = MessageBuilder.withPayload("发送异步消息").build();
    rocketMQTemplate.asyncSend(topic, message ,new SendCallback() {
        @Override
        public void onSuccess(SendResult sendResult) {
            System.out.println("消息发送状态===>"+sendResult.getSendStatus());
        }

        @Override
        public void onException(Throwable throwable) {
            System.out.println("出现异常");
        }
    });

    Thread.sleep(3000);
}

发送一次性消息

@Test
public void testSendOneWayMsg() {
    String topic = "helloTopic";
    Message<String> message = MessageBuilder.withPayload("发送一次性消息").build();
    rocketMQTemplate.sendOneWay(topic,message);
}

消费模式

设置广播消费模式
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;

@Component
@RocketMQMessageListener(consumerGroup = "helloTopicGroup",topic = "helloTopic",messageModel = MessageModel.BROADCASTING)
public class HelloListener implements RocketMQListener<MessageExt> {
    @Override
    public void onMessage(MessageExt messageExt) {
        System.out.println("消息内容为===>"+new String(messageExt.getBody()));
    }
}

延时消息

@Test
public void testSendDelayMsg(){
    String topic = "helloTopic";
    Message<String> message = MessageBuilder.withPayload("延时消息").build();
    rocketMQTemplate.syncSend(topic,message,3000,3);
}

Tag消息过滤

发送消息
@Test
public void testSendTagMsg(){
    String topic = "tagTopic";
    Message<String> message1 = MessageBuilder.withPayload("消息1").build();
    Message<String> message2 = MessageBuilder.withPayload("消息2").build();
    Message<String> message3 = MessageBuilder.withPayload("消息3").build();
    rocketMQTemplate.sendOneWay(topic+":"+"TagA",message1);
    rocketMQTemplate.sendOneWay(topic+":"+"TagB",message2);
    rocketMQTemplate.sendOneWay(topic+":"+"TagC",message3);
}
消费消息
@Component
@RocketMQMessageListener(consumerGroup = "tagTopicGroup",topic = "tagTopic",selectorExpression = "TagA || TagC")
public class TagListener implements RocketMQListener<MessageExt> {
    @Override
    public void onMessage(MessageExt messageExt) {
        System.out.println("Tag 消息内容为===>"+new String(messageExt.getBody()));
    }
}

SQL消息过滤

发送者
@Test
public void testSendSqlMsg(){
    String topic = "sqlTopic";
    Message<String> message1 = MessageBuilder.withPayload("用户1").setHeader("age",20).build();
    Message<String> message2 = MessageBuilder.withPayload("用户2").setHeader("age",35).build();
    Message<String> message3 = MessageBuilder.withPayload("用户3").setHeader("age",66).build();
    rocketMQTemplate.sendOneWay(topic,message1);
    rocketMQTemplate.sendOneWay(topic,message2);
    rocketMQTemplate.sendOneWay(topic,message3);
}
消费者
@Component
@RocketMQMessageListener(consumerGroup = "sqlTopicGroup",topic = "sqlTopic",selectorType = SelectorType.SQL92,selectorExpression = "age < 30")
public class SqlListener implements RocketMQListener<MessageExt> {
    @Override
    public void onMessage(MessageExt messageExt) {
        System.out.println("Tag 消息内容为===>"+new String(messageExt.getBody()));
    }
}

顺序消息

发送者
@Test
public void testSendOrderlyMsg(){
    String topic = "helloTopic";
    String id = "11";
    Message<String> message1 = MessageBuilder.withPayload(id).build();
    rocketMQTemplate.setMessageQueueSelector((list, message, o) -> {
        long id1 = Long.parseLong(o.toString());
        int index = (int) (id1 % list.size());
        return list.get(index);
    });
    rocketMQTemplate.sendOneWayOrderly(topic,message1,id);
}
消费者
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;

@Component
@RocketMQMessageListener(consumerGroup = "orderTopicGroup",topic = "orderTopic",consumeMode = ConsumeMode.ORDERLY)
public class OrderListener implements RocketMQListener<MessageExt> {
    @Override
    public void onMessage(MessageExt messageExt) {
        System.out.println("线程===>"+Thread.currentThread().getName()+",队列ID===>"+messageExt.getQueueId()+",消息内容为===>"+new String(messageExt.getBody()));
    }
}

死信队列

  • 消息者在消息处理完成之后,会给消息中间件反馈处理的情况(RocketMQ已经帮我们做了),这个反馈叫ACK
  • 死信队列:消息中间件给消费者发送消息,如果消费不成功,隔段时间会继续发送,但是重试的次数是有限的,重试16次,如果重试16次都不成功,说明程序无法自动消费该消息,该消息会进入到死信队列DLQ队列中,通常需要监听,拿出这些消息出来,进行手动处理。
  • 重试间隔:30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值