记一次dubbo异步调用超时的bug

背景:
最近线上某个接口时不时会报超时,观察一段时间发现,只要provider处理业务超过1秒该现象就会重现(实际超时时间设置为20秒)。不管怎么看代码和超时配置都没有问题。

解决:
开发环境还原场景,provider强制睡眠3秒,在客户端debug。
经过一天的摸索,发现原来是dubbo异步本身的bug。在代码中设置了超时时间,但是单位是秒,会被重置为默认值1s。

不再多说了,直接上代码演示
provider使用的dubbo版本为2.5.3
记一次dubbo异步调用超时的bug
客户端通过异步方式获取消息。
记一次dubbo异步调用超时的bug
当设置future.get(5, TimeUnit.SECONDS)时,会出现转换错误。
如下图,当超时单位不为毫秒时,timeoutInMillis恒等于0。
这使得设置的timeout不生效,超时时间会走默认的1000ms。
记一次dubbo异步调用超时的bug
最后总结一下:
dubbo超时机制优先级:
客户端方法级>服务端方法级>客户端接口级>服务端接口级>客户端全局>服务端全局
测试还发现:
若xml设置5s,get设置2s则以get为准
若xml设置2s,get设置5s则以xml为准
若get不设置,默认以xml为准。
若全不设置,默认1000ms。