目录
🥝 return new SpringJobScheduler()
🥝定义一个JobExceptionHandler,用来处理任务执行过程中的异常。在处理异常时需要根据异常类型来判断是否需要重试。
🥝在Elastic-Job配置中,可以通过设置JobProperties来实现重试机制的相关配置。常用的设置包括:
🥝前言:
你知道的,笔记!
在面试的时候,可能都会涉及到实战业务场景问题, 今天分享一个,希望面试能够用得上,提供具体实现思路...
🥝实现逻辑:
下单消息失败,消费者在处理消息时,先判断该订单号在重试的表有没有数据,如果有则直接把当前消息保存重试表,如果没有则进行业务处理,如果出现异常,把该消息保存到重试表,用elastic-job失败重试机制,当然还可以使用其他业务来完成,或者海豚调度也是可以的我记得
🥝创建重试表
id:消息唯一标识
orderNo:订单号
message:消息内容
retryCount:重试次数
nextRetryTime:下次重试时间
createTime:创建时间
updateTime:更新时间
CREATE TABLE retry_order (
id varchar(32) NOT NULL,
order_no varchar(32) NOT NULL,
message varchar(2048) NOT NULL,
retry_count int NOT NULL,
next_retry_time datetime NOT NULL,
create_time datetime NOT NULL,
update_time datetime NOT NULL,
PRIMARY KEY (id)
);
🥝消息队列进行异步消费
消息队列中注册一个消息监听器,然后根据推送的消息去实现业务逻辑处理
@Service
public class OrderMessageConsumer implements MessageListener {
private static final Logger LOGGER = LoggerFactory.getLogger(OrderMessageConsumer.class);
@Autowired
private OrderService orderService;
@Autowired
private RetryOrderService retryOrderService;
@Override
public Action consume(Message message, ConsumeContext context) {
try {
// 解析消息内容
String orderNo = new String(message.getBody(), Charset.forName("UTF-8"));
// 判断重试表中是否存在该订单号的记录
RetryOrder retryOrder = retryOrderService.getByOrderNo(orderNo);
if (retryOrder != null) {
// 保存消息到重试表中
retryOrder.setMessage(message.getBody());
retryOrder.setNextRetryTime(new Date());
retryOrderService.save(retryOrder);
return Action.CommitMessage;
}
// 处理业务逻辑
orderService.createOrder(orderNo);
return Action.CommitMessage;
} catch (Exception e) {
LOGGER.error("Consume message failed", e);
// 保存消息到重试表中
RetryOrder retryOrder = new RetryOrder();
retryOrder.setId(UUID.randomUUID().toString());
retryOrder.setOrderNo(new String(message.getBody(), Charset.forName("UTF-8")));
retryOrder.setMessage(message.getBody());
retryOrder.setRetryCount(0);
retryOrder.setNextRetryTime(new Date());
retryOrderService.save(retryOrder);
return Action.ReconsumeLater;
}
}
}
优化前的代码中使用了消息队列进行异步消费,因此需要实现MessageListener接口来处理消息。这种方式下,消息队列会自动将消息推送给MessageListener的实现类进行处理,不需要手动触发任务。
优化后的代码中,使用了Elastic-Job进行定时任务调度。由于Elastic-Job提供了任务分片机制,可以将任务分成多个片段,并通过多个作业节点并发执行,因此可以替代消息队列的异步消费方式。
在使用Elas

最低0.47元/天 解锁文章
1423

被折叠的 条评论
为什么被折叠?



