zoukankan      html  css  js  c++  java
  • 发送消息 缺少 更新的字段值

    背景

    先看一段代码:

    @Transactional(rollbackFor = Exception.class)
        public boolean cancel(OrderRequest request) {
            long start = System.currentTimeMillis();
            String orderId = request.getOrderId();
            String operator = request.getOperator();
            String cancelMsg = request.getCancelMsg();
    
            ....
              //1,更新 calcelMsg 到 order
            updateCancelMsg(cancelMsg, order);
    
           //notify
          //2、从order中获取 cancleMsg 直接发送消息。 是@Async 方法
           asynTaskService.notify(orderId,ORDER_CANCEL);
            //修正
           // asynTaskService.notifyOss(orderId, cancelMsg, ORDER_CANCEL);
                    
    
            //3、其他业务逻辑
    				...
              
            } catch (Exception e) {
               ...
            } finally {
                ...
            }
    
            return true;
        }
    

    从这个代码中 能 发现问题吗?

    在本地 调试的时候,没有发现问题,在测试环境 三方联调的时候, 基本是 必现的问题。问题反馈后,有调式,没问题....。检查了所有环境,配置,jar。 问题肯定是存在的。重新 审视代码。

    排查

    步骤一

    打log。 在回调信息中,吧 获取到的 cancleMsg 和order信息打印出来。

    确实发现了问题。

    获取时的时间 早于 更新 驳回消息的时间。这就是问题所有。

    步骤二

    回归代码,查找问题的根源。

    @Transactional

    @Async

    这个方法中使用了 Transactional, 并且 notify 方法用了异步。

    Transactional 的存在,使 更新 cancelMsg 的 commit 时间点 延后了,

    异步化,是 notify的执行的时间点 随机了 没有必然的 先后顺序了。

  • 相关阅读:
    最近遇到了这个坑,特意记录下
    《java8实战阅读笔记》
    Namespace的简讲
    发展历程C++及C++与C语言的关系
    进程间通信的概述2
    本来调试无误的程序在真机运行时报标题错误解决方案
    navagationController 的子控制器如何取消右滑返回
    iOS常见的设计模式
    代码:Masonry 第三方框架
    Autolayout的在storyboard警告和错误
  • 原文地址:https://www.cnblogs.com/idea-persistence/p/14050694.html
Copyright © 2011-2022 走看看