RocketMQ使用总结

消息发送

普通消息

生产者多次循环发送该消息,broker收到消息顺序会不一致,因为convertAndSend并没有等上一条信息发送完并收到响应再发送下一条消息

@GetMapping("/send")
public String send() {
   
	rocketMQTemplate.convertAndSend("topic","普通消息");
	return "发送成功";
}

同步消息

producer向 broker 发送消息后同步等待, 直到broker 服务器返回发送结果

 @GetMapping("/sync")
public String sync() {
   
    SendResult sendResult = rocketMQTemplate.syncSend("topic:sync", "同步消息");
    if (sendResult.getSendStatus() == SendStatus.SEND_OK) {
   
        return "同步发送成功";
    }
    return "同步发送失败";
}

SendStatus中有四种状态

状态 意义
SendStatus.SEND_OK 消息发送成功,需要将消息刷盘和消息复制到 slave 节点变为同步才是真正发送成功
SendStatus. FLUSH_DISK_TIMEOUT 消息发送成功但消息刷盘超时
SendStatus.FLUSH_SLAVE_TIMEOUT 消息发送成功但是消息同步到slave节点超时
SendStatus.SLAVE_NOT_AVAILABLE 消息发送成功但是broker的slave节点不可用

配置消息刷盘同步,配置消息复制到slave为同步,将flushDiskType刷盘方式设为同步刷盘,将brokerRole角色设为同步双写
/conf/broker.conf

flushDiskType=SYNC_FLUSH #ASYNC_FLUSH 异步刷盘; SYNC_FLUSH 同步刷盘
brokerRole=SYNC_MASTER # Broker的角色: ASYNC_MASTER 异步复制; SYNC_MASTER 同步双写; SLAVE 努力

异步消息

producer向 broker 发送消息注册回调方法,调用 API 后立即返回,消息发送成功或失败的回调任务在一个新的线程中执行

@GetMapping("/async")
public String async() {
   
    rocketMQTemplate.asyncSend("topic:async", "异步消息", new SendCallback() {
   
        @Override
        public void onSuccess(SendResult sendResult) {
   
            System.out.println("异步消息发送成功");
        }

        @Override
        public void onException(Throwable throwable) {
   
            System.out.println("异步消息发送失败");
        }
    });

    return "发送异步消息";
}

topic:async中的topic是主题,async是tag,用于区分一个主题下的不同tag,之间用冒号隔开,在写消费者时,topic写主题,selectorExpression写tag的表达式,支持 * || 这些匹配逻辑

@Component
@RocketMQMessageListener(topic = "topic",
selectorExpression = "async",consumerGroup = "my-consumer-group")
public class Consumer implements RocketMQListener<String> {
   
    @Override
    public void onMessage(String message) {
   
        System.out.println(message);
    }
}

单向消息

producer向 broker 发送消息,执行 API 时直接返回,不等待broker 服务器的结果 ,也不注册回调函数

@GetMapping("/oneWay")
public String oneWay() {
   
    rocketMQTemplate.sendOneWay("oneWay", "单向消息");
    return "单向消息发送成功";
}

顺序消息

RocketMQ的一个主题topic下会有多个消息队列,使用setMessageQueueSelector将信息发送指定的消息队列,如list.get(1)就是指定1这个队列,生产环境可以将id根据队列数list.size()取模,则如果发送多次消息,这多次消息都在该队列中排队即有序,前面完成了有序存储,后面需要消费者有序消费

@RequestMapping("/orderly")
public String orderly() {
   
    rocketMQTemplate.setMessageQueueSelector(new MessageQueueSelector() {
   
        @Override
        public MessageQueue select(List<MessageQueue> list, org.apache.rocketmq.common.message.Message message, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lolxxs

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

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

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

打赏作者

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

抵扣说明:

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

余额充值