这个 bug 让我毫无头绪啊

2020-08-12 18:05:39 +08:00
 luxinfl
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"}}
3863 次点击
所在节点    Java
16 条回复
laminux29
2020-08-12 18:27:51 +08:00
调试。
siweipancc
2020-08-12 18:36:38 +08:00
代码贴全了,至少给个地址吧……
luxinfl
2020-08-12 18:49:35 +08:00
@siweipancc 公司代码。不能全贴了。。流程就是通过 feignclient 调用一个方法,根据方法的返回结果判断。
但是现在从日志看的情况,判断处理在调用返回结果之前了。就感觉很奇怪。
然后整个大方法是在 new Thread(()->{}).start()里面的
Kirsk
2020-08-12 18:54:39 +08:00
用阻塞的思路排查 百度 feignclient 多线程 等待
hunterzhang86
2020-08-12 19:26:57 +08:00
是不是调用超时了
AlbertChen
2020-08-12 19:27:27 +08:00
[cgbs,,,]
[cgbs,5c92785f8254878a,5c92785f8254878a,false] [hystrix-cms-10]

feign 明显是在其他线程运行的
cxshun
2020-08-12 19:31:25 +08:00
@luxinfl #3 可以开一下 feign 的日志看一下 http 调用的情况,看日志跟 @AlbertChen #6 说的一样,是在另外一个线程跑的,而且是用的 hystrix 的线程,是不是开启了熔断啥的了
bianjp
2020-08-12 19:33:48 +08:00
会不会是配置了熔断且触发熔断的超时时间过小(默认好像是 1s )导致请求还没响应就触发熔断了?
potatowish
2020-08-13 08:19:46 +08:00
1.轮询,2.改造 contractAutoMake 方法,用 FutureTask 返回异步执行结果
luxinfl
2020-08-13 11:17:13 +08:00
@hunterzhang86 我在熔断方法里面打印了,结果看起是超时了。现在再看为啥就这个方法会这样。因为其他的 feignclient 没有问题,就单单这个方法出现问题了
luxinfl
2020-08-13 11:17:53 +08:00
@AlbertChen 这个所有的 feign 都是在其他线程运行的,别的 feign 都没问题,不知道为啥就这一个,明明有返回结果,但是却提前熔断了。
luxinfl
2020-08-13 11:18:16 +08:00
@bianjp 这个熔断应该是默认所有生效的,其他 feign 就没有错误。。
luxinfl
2020-08-13 11:27:25 +08:00
@bianjp 我又看了其他的 feign,好像就这个超过了 1s 钟,现在再尝试配置一下,调看看。。。
@cxshun
yyyfor
2020-08-13 13:42:01 +08:00
feign 默认连接和读取的时间都是 1s 。改下配置项试试?
feign.client.config.default.readTimeout=3000
feign.client.config.default.connectTimeout=3000
larisboy
2020-08-13 15:09:32 +08:00
看看是不是请求超时进入 mock 方法了
luxinfl
2020-08-13 15:25:21 +08:00
@yyyfor 解决了。应该不是 feign 的问题。hystrix
@larisboy 断路器超 1s 直接熔断了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/697753

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX