dubbo custom调用provider提供的远程方法超时,报错如下:
com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2019-10-30 22:36:40.888, end time: 2019-10-30 22:36:41.901, client elapsed: 0 ms, server elapsed: 1013 ms, timeout: 1000 ms, request: Request [id=23, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=textToSpeech, parameterTypes=[class java.lang.String], arguments=[这是一个很长的测试tts文本内容...], attachments={path=com.example.dubboapi.service.tts.TtsService, interface=com.example.dubboapi.service.tts.TtsService, version=0.0.0}]], channel: /172.01.12.222:38934 -> /172.01.12.222:20883
at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.returnFromResponse(DefaultFuture.java:216) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:137) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:111) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker.doInvoke(DubboInvoker.java:95) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:142) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:74) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:53) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:47) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:73) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:52) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:77) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:232) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:70) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:51) ~[dubbo-2.6.0.jar!/:2.6.0]
at com.alibaba.dubbo.common.bytecode.proxy1.textToSpeech(proxy1.java) ~[dubbo-2.6.0.jar!/:2.6.0]
...
原因:provider 和 custom 都没有设置超时值,而且超时值默认超时值都是1秒,如果调用需要花费的时间过长就会报超时错误。
解决:provider 或 custom 设置超时值。注意:超时值需要根据实际情况设置不要过长。
<dubbo:provider timeout=“2000” />
<dubbo:consumer timeout=“2000” />
例:
<!--提供者-->
<dubbo:provider timeout="2000"/>
<dubbo:service protocol="dubbo" ref="daoInformationService" interface="com.xxx.dubboapi.service.dao.DaoInformationService"/>
<bean id="daoInformationService" class="com.xxx.serverdao.service.DaoInformationServiceImpl"/>
<dubbo:service protocol="dubbo" ref="daoRobotLogService" interface="com.xxx.dubboapi.service.dao.DaoRobotLogService"/>
<bean id="daoRobotLogService" class="com.xxx.serverdao.service.DaoRobotLogServiceImpl"/>
注:单位是毫秒
provider 和 custom 都可以设置超时值,区别
如果provider和consumer都设置了超时值,dubbo会默认优先使用provider的配置。