一.业务逻辑分析
项目中遇到这样一个业务:订单生成后,每个订单会有一个url地址,然后根据订单的相关状态和url地址进行回调处理;开始是使用redis的延迟队列进行处理,把订单信息封装成消息放入延迟队列,并设置index;然后使用分布式调度系统,定时从延迟队列中取出消息进行消费pop,如果消费异常就重新放入延迟队列并index+1;后来发现性能有点低,所以考虑rocketmq的延迟消息队列;
订单生成->封装消息,mq消费者异步发送(rocketmq 发送消息:同步sendResult,异步void有回调,oneway一次性发送)->mq消费者消费消息(并封装RocketMQTemplate ,消费异常时候重新发送消息)
二,rocket配置
1.引入maven依赖:
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
2.yml 配置:
rocketmq:
name-server: 10.101.71.133:9876 #连接的rocketmq服务 name-serve地址
producer:
group: my-group
retry-times-when-send-failed: 2
retry-times-when-send-async-failed: 2
3.测试 异步发送消息:
@Resource
private RocketMQTemplate rocketMQTemplate;
@Test
public void testRocketMq1() {
NotifyVo notifyVo = new NotifyVo();
notifyVo.setOrderNumber("3ea9da3a5037449fa5acf6dd18658fc8");
notifyVo.setIndex(1);
notifyVo.setPaymentNumber("1152160156201185280");
rocketMQTemplate.asyncSend("WALLET_ORDER_TOPIC", MessageBuilder.withPayload(notifyVo).build(), new SendCallback() {
@Override
public void onSuccess(SendResult var1) {
log.info("async onSucess SendResult :{}", var1);
}
@Override
public void onException(Throwable var1) {
log.info("async onException Throwable :{}", var1);
}
}, 300000, 2);
4.消费消息:
@Service
@Slf4j
@RocketMQMessageListener(topic = WALLET_ORDER_TOPIC, consumerGroup = WALLET_ORDER_CONSUMER)
public class NotifyEventConsumer implements RocketMQListener<NotifyVo> {
@Autowired
private AsyncRestTemplate asyncRestTemplate;
@Autowired
private OrderLogService orderLogService;
@Autowired
private OrderService orderService;
@Resource
private RocketMQTemplate rocketMQTemplate;
@Override
public void onMessage(NotifyVo message) {
log.info("------- NotifyEventConsumer received:" + JSON.toJSONString(message));
//消息处理逻辑
}
}
三:总结点
1.关于rocketmq的topic