天天看點

dubbo 消費者custom調用提供者provider的遠端方法逾時,com.alibaba.dubbo.remoting.TimeoutException

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的配置。

繼續閱讀