[Java实战业务场景,下单消息失败?如何解决?]

目录

🥝前言:

🥝实现逻辑:

🥝创建重试表

🥝消息队列进行异步消费

🥝Elastic-Job进行定时任务调度

🥝Elastic-Job设置

🥝 return new SpringJobScheduler()

🥝定义一个JobExceptionHandler,用来处理任务执行过程中的异常。在处理异常时需要根据异常类型来判断是否需要重试。

🥝重试机制实现

🥝在Elastic-Job配置中,可以通过设置JobProperties来实现重试机制的相关配置。常用的设置包括:

🥝Elastic-Job实现流程:


🥝前言:

     你知道的,笔记!

     在面试的时候,可能都会涉及到实战业务场景问题, 今天分享一个,希望面试能够用得上,提供具体实现思路...

🥝实现逻辑:

下单消息失败,消费者在处理消息时,先判断该订单号在重试的表有没有数据,如果有则直接把当前消息保存重试表,如果没有则进行业务处理,如果出现异常,把该消息保存到重试表,用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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是汤圆丫

怎么 给1分?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值