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秒后,消费了消息