V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
luxinfl
V2EX  ›  Java

这个 bug 让我毫无头绪啊

  •  
  •   luxinfl · 2020-08-12 18:05:39 +08:00 · 2841 次点击
    这是一个创建于 472 天前的主题,其中的信息可能已经有所发展或是发生改变。
    logger.info("自动制作合同入参:{}", GsonUtils.toJson(applyMakeContractRequestDto));
                ResponseDto<JSONObject> responseDto = cmsChannel.contractAutoMake(applyMakeContractRequestDto);
                if (responseDto.isSuccess()) {
                    logger.info("合同制作完成 result:{}", responseDto);
                    if (!StringUtils.isEmpty(responseDto.getData())) {
                        applyCode = responseDto.getData().getString("applyCode");
                    }
                } else {
                    logger.info("合同制作失败 result:{}", responseDto.getMsg());
                }
    

    这个是在线程里面跑的代码,contractAutoMake 通过 feignclient 调用之后其他服务。但是还没有返回结果的时候程序却往下面流程跑了,跑到了合同制作失败。。

    2020-08-12 16:42:19.830  INFO [cgbs,,,] [Thread-793]  - 自动制作合同入参:{""}
    2020-08-12 16:42:19.833 DEBUG [cgbs,5c92785f8254878a,5c92785f8254878a,false] [hystrix-cms-10] c.z.c.c.g.c.cms.ICmsChannel:72 - [ICmsChannel#contractAutoMake] ---> POST http://cms/apply/applyAndMakeContract HTTP/1.1
    ....省略...
    2020-08-12 16:42:19.834 DEBUG [cgbs,5c92785f8254878a,5c92785f8254878a,false] [hystrix-cms-10] c.z.c.c.g.c.cms.ICmsChannel:72 - [ICmsChannel#contractAutoMake] ---> END HTTP (587-byte body)
    2020-08-12 16:42:20.833  INFO [cgbs,,,] [Thread-793] c.z.c.c.c.f.i.ContractAutoFacadeImpl:121 - 合同制作失败 result:处理失败
    2020-08-12 16:42:21.006  INFO [cgbs,,,] [com.alibaba.nacos.client.Worker.longPolling.fixed-nacos-sst.joinboom.net_80-zalljinfu-cgbs] c.a.n.c.config.impl.ClientWorker:527 - get changedGroupKeys:[]
    ....省略...
    2020-08-12 16:42:21.710 DEBUG [cgbs,5c92785f8254878a,5c92785f8254878a,false] [hystrix-cms-10] c.z.c.c.g.c.cms.ICmsChannel:72 - [ICmsChannel#contractAutoMake] {"success":true,"code":"100000","msg":"处理成功","data":{"applyCode":"MAC20200812164219864333"}}
    
    第 1 条附言  ·  2020-08-13 15:24:05 +08:00

    解决了,加了一个配置项

    hystrix:
      command:
        default:
          execution:
            isolation:
              thread:
                timeoutInMilliseconds: 60000 
    
    16 条回复    2020-08-13 15:25:21 +08:00
    laminux29
        1
    laminux29   2020-08-12 18:27:51 +08:00
    调试。
    siweipancc
        2
    siweipancc   2020-08-12 18:36:38 +08:00 via iPhone
    代码贴全了,至少给个地址吧……
    luxinfl
        3
    luxinfl   2020-08-12 18:49:35 +08:00
    @siweipancc 公司代码。不能全贴了。。流程就是通过 feignclient 调用一个方法,根据方法的返回结果判断。
    但是现在从日志看的情况,判断处理在调用返回结果之前了。就感觉很奇怪。
    然后整个大方法是在 new Thread(()->{}).start()里面的
    Kirsk
        4
    Kirsk   2020-08-12 18:54:39 +08:00 via Android
    用阻塞的思路排查 百度 feignclient 多线程 等待
    hunterzhang86
        5
    hunterzhang86   2020-08-12 19:26:57 +08:00
    是不是调用超时了
    AlbertChen
        6
    AlbertChen   2020-08-12 19:27:27 +08:00
    [cgbs,,,]
    [cgbs,5c92785f8254878a,5c92785f8254878a,false] [hystrix-cms-10]

    feign 明显是在其他线程运行的
    cxshun
        7
    cxshun   2020-08-12 19:31:25 +08:00
    @luxinfl #3 可以开一下 feign 的日志看一下 http 调用的情况,看日志跟 @AlbertChen #6 说的一样,是在另外一个线程跑的,而且是用的 hystrix 的线程,是不是开启了熔断啥的了
    bianjp
        8
    bianjp   2020-08-12 19:33:48 +08:00
    会不会是配置了熔断且触发熔断的超时时间过小(默认好像是 1s )导致请求还没响应就触发熔断了?
    potatowish
        9
    potatowish   2020-08-13 08:19:46 +08:00 via iPhone
    1.轮询,2.改造 contractAutoMake 方法,用 FutureTask 返回异步执行结果
    luxinfl
        10
    luxinfl   2020-08-13 11:17:13 +08:00
    @hunterzhang86 我在熔断方法里面打印了,结果看起是超时了。现在再看为啥就这个方法会这样。因为其他的 feignclient 没有问题,就单单这个方法出现问题了
    luxinfl
        11
    luxinfl   2020-08-13 11:17:53 +08:00
    @AlbertChen 这个所有的 feign 都是在其他线程运行的,别的 feign 都没问题,不知道为啥就这一个,明明有返回结果,但是却提前熔断了。
    luxinfl
        12
    luxinfl   2020-08-13 11:18:16 +08:00
    @bianjp 这个熔断应该是默认所有生效的,其他 feign 就没有错误。。
    luxinfl
        13
    luxinfl   2020-08-13 11:27:25 +08:00
    @bianjp 我又看了其他的 feign,好像就这个超过了 1s 钟,现在再尝试配置一下,调看看。。。
    @cxshun
    yyyfor
        14
    yyyfor   2020-08-13 13:42:01 +08:00
    feign 默认连接和读取的时间都是 1s 。改下配置项试试?
    feign.client.config.default.readTimeout=3000
    feign.client.config.default.connectTimeout=3000
    larisboy
        15
    larisboy   2020-08-13 15:09:32 +08:00
    看看是不是请求超时进入 mock 方法了
    luxinfl
        16
    luxinfl   2020-08-13 15:25:21 +08:00
    @yyyfor 解决了。应该不是 feign 的问题。hystrix
    @larisboy 断路器超 1s 直接熔断了。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2191 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:03 · PVG 19:03 · LAX 03:03 · JFK 06:03
    ♥ Do have faith in what you're doing.