RocketMQ代码实战(七):延时消息

maven依赖和配置参考RocketMQ代码实战(一):使用rocketmq-spring-boot-starter发送和消费消息

延时消息使用场景:

比如电商里,提交了一个订单就可以发送一个延时消息,1h后去检查这个订单的状态,如果还是未付款就取消订单释放库存。

上代码:

消息发送

@RestController
@Slf4j
public class RocketMqController {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    @GetMapping("sendMqDelay")
    public Object sendMqDelay() {
        //延时消息的使用限制
        //private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h";
        //现在RocketMq并不支持任意时间的延时,需要设置几个固定的延时等级,从1s到2h分别对应着等级1到18 消息消费失败会进入延时消息队列
        MqMessage message = MqMessage.builder().name("延时消息").msg("这是延时消息" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))).build();
        SendResult sendResult = rocketMQTemplate.syncSend(MqUtil.delay_topic, MessageBuilder.withPayload(message).build(), 2000, 4);
        return sendResult;
    }

}

方法org.apache.rocketmq.spring.core.RocketMQTemplate#syncSend(String destination, Message<?> message, long timeout, int delayLevel)中的delayLevel参数设置了延迟的级别。

延迟级别从1到18分别对应了1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

接收消息:

@Slf4j
@Component
@RocketMQMessageListener(
        topic = MqUtil.delay_topic,
        consumerGroup = "delay_consumer_a_group")
public class DelayListener implements RocketMQListener<MqMessage> {
    @Override
    public void onMessage(MqMessage message) {
        log.info("{}于{}收到消息:{}", this.getClass().getSimpleName(), LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), message);
    }
}

启动程序后访问:http://127.0.0.1:8080/sendMqDelay 30秒后控制台打印日志:

DelayListener于2021-05-08 22:00:16收到消息:MqMessage(name=延时消息, msg=这是延时消息2021-05-08 21:59:46)

30秒后,消费了消息

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RocketMQ支持延时消息,可以通过设置消息延时级别(Delay Level)来指定消息延时时间。延时级别是通过设置消息的属性来实现的。 在RocketMQ中,延时消息实现原理是通过将消息发送到延时消息队列(Delay Queue)中,在指定的延时时间后再将消息延时消息队列中取出,发送到目标消息队列中。 延时消息可以用于各种场景,比如定时任务、订单超时提醒等。 下面是使用RocketMQ发送延时消息的示例代码: ``` // 创建生产者实例 DefaultMQProducer producer = new DefaultMQProducer("producer_group"); // 设置NameServer地址 producer.setNamesrvAddr("localhost:9876"); // 启动生产者实例 producer.start(); // 创建消息实例,设置消息内容 Message msg = new Message("topic_name", "tag_name", "Hello RocketMQ".getBytes()); // 设置消息延时级别为3,表示延时10s发送 msg.setDelayTimeLevel(3); // 发送消息 SendResult result = producer.send(msg); // 输出发送结果 System.out.println(result); // 关闭生产者实例 producer.shutdown(); ``` 在这个示例中,我们创建了一个生产者实例,并设置了NameServer地址。然后创建一个消息实例,设置消息内容,并将延时级别设置为3。最后发送消息,并输出发送结果。 需要注意的是,延时消息延时时间是在消息发送后计算的,而不是在消息创建时计算的。因此,如果需要精确控制延时时间,需要考虑网络延迟等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值