开发环境
-
- Springboot 3.0.3
- rocketMQ 2.3.0
概要
基于Springboot3集成RockerMQ实现延迟消息,用于电商用户没能支付订单并且生成了支付订单,30分钟后取消订单
整体架构流程
先加入相关的依赖,提供rocketMQ 2.3.0,可以自己用Springboot3相关依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
编写配置文件.yml
rocketmq:
consumer:
#group: springboot3_consumer_group
# 一次拉取消息最大值,注意是拉取消息的最大值而非消费最大值
pull-batch-size: 10
name-server: 127.0.0.1:9876
producer:
# 发送同一类消息的设置为同一个group,保证唯一
group: springboot3_producer_group
# 发送消息超时时间,默认3000
sendMessageTimeout: 10000
# 发送消息失败重试次数,默认2
retryTimesWhenSendFailed: 2
# 异步消息重试此处,默认2
retryTimesWhenSendAsyncFailed: 2
# 消息最大长度,默认1024 * 1024 * 4(默认4M)
maxMessageSize: 4096
# 压缩消息阈值,默认4k(1024 * 4)
compressMessageBodyThreshold: 4096
# 是否在内部发送失败时重试另一个broker,默认false
retryNextServer: false
创建消息生产者
@Autowired
private RocketMQTemplate rocketMQTemplate;
@PostMapping("/createOrder")
public AjaxResult createOrder() {
Message message = new Message();
message.setTopic("order");
message.setBody(order.getBytes());
message.setDelayTimeLevel(16); // 默认变量有1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h,分别对应1~18等级。例如等级为3,对应于10s
try {
rocketMQTemplate.getProducer().setProducerGroup("springboot3_producer_group");
rocketMQTemplate.getProducer().setNamesrvAddr("127.0.0.1:9876");
rocketMQTemplate.getProducer().send(message);
} catch (MQClientException e) {
throw new RuntimeException(e);
} catch (RemotingException e) {
throw new RuntimeException(e);
} catch (MQBrokerException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(" 消息发送成功!=====>" + order);
return success(true);
}
创建消息消费者
/**
* @author yan
* @describe "严禁过度自燃!"
* @time 2024/3/24 19:36:58
*/
@Component
@Slf4j
@RocketMQMessageListener(topic = "order", consumerGroup = "springboot3_producer_group")
public class RocketmqReceiver implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
log.info("接受到的消息:===》{}", s);
tzBusinessOrderService.deleteTzBusinessOrderByOrderParentNo(s);
// 下方为博主的业务操作,可执行更换成你需要额业务操作
List<TzBusinessOrder> tzBusinessOrders = tzBusinessOrderService.selectBusinessOrderByParentNo(s);
for (Long id : tzBusinessOrders.stream().map(TzBusinessOrder::getOrderGoods).toList()) {
iTzBusinessGoodsService.updateTzBusinessGoodsByGoodsIdSetGoodsNum(id, tzBusinessOrders.stream().filter(order -> order.getOrderGoods().equals(id)).map(TzBusinessOrder::getOrderNum).findAny().orElse(null));
}
}
}
小结
简单的消息延迟,可以存放对象等