1. 程式人生 > >com.alibaba.dubbo.remoting.RemotingException: Caused by: java.nio.channels.ClosedChannelException

com.alibaba.dubbo.remoting.RemotingException: Caused by: java.nio.channels.ClosedChannelException

生產遇到的一個異常如下:

com.alibaba.dubbo.remoting.RemotingException: Failed to send message Response [id=0, version=2.0.0, status=20, event=false, error=null, result=RpcResult [result=Fruit(name=null, color=oops), exception=null]] to /169.254.18.108:63462, cause: null
	at com.alibaba.dubbo.remoting.transport.netty.NettyChannel.send(NettyChannel.java:108)
	at com.alibaba.dubbo.remoting.transport.AbstractPeer.send(AbstractPeer.java:51)
	at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:171)
	at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)
	at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:82)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.nio.channels.ClosedChannelException
	at org.jboss.netty.channel.socket.nio.NioWorker.cleanUpWriteBuffer(NioWorker.java:643)
	at org.jboss.netty.channel.socket.nio.NioWorker.writeFromUserCode(NioWorker.java:370)
	at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleAcceptedSocket(NioServerSocketPipelineSink.java:137)
	at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:76)
	at org.jboss.netty.channel.Channels.write(Channels.java:632)
	at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:70)
	at com.alibaba.dubbo.remoting.transport.netty.NettyHandler.writeRequested(NettyHandler.java:99)
	at org.jboss.netty.channel.Channels.write(Channels.java:611)
	at org.jboss.netty.channel.Channels.write(Channels.java:578)
	at org.jboss.netty.channel.AbstractChannel.write(AbstractChannel.java:251)
	at com.alibaba.dubbo.remoting.transport.netty.NettyChannel.send(NettyChannel.java:98)
	... 7 more

這個異常通常在dubbo服務中發生在服務的提供端,同時這個異常一般還會跟另外一個結對出現,在服務的消費端會發生如何錯誤:

Exception in thread "pool-1-thread-1" com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method getColor in the service com.alibaba.dubbo.demo.api.DemoService. Tried 1 times of the providers [169.254.18.108:20880] (1/1) from the registry 118.24.157.71:2181 on the consumer 169.254.18.108 using the dubbo version 2.5.3. Last error is: Invoke remote method timeout. method: getColor, provider: dubbo://169.254.18.108:20880/com.alibaba.dubbo.demo.api.DemoService?anyhost=true&application=consumer-of-helloworld-app&check=false&default.reference.filter=consumerTraceFilter&default.service.filter=providerTraceFilter&dubbo=2.5.3&interface=com.alibaba.dubbo.demo.api.DemoService&methods=sayHello,getColor,doValidate&pid=20632&retries=0&side=consumer&timeout=5000&timestamp=1539442169002, cause: Waiting server-side response timeout by scan timer. start time: 2018-10-13 22:49:31.965, end time: 2018-10-13 22:49:36.994, client elapsed: 66 ms, server elapsed: 4962 ms, timeout: 5000 ms, request: Request [id=0, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=getColor, parameterTypes=[class com.alibaba.dubbo.demo.api.bean.Fruit], arguments=[Fruit(name=null, color=)], attachments={traceId=53feab28645f492baec2b8a185f1a1ca, path=com.alibaba.dubbo.demo.api.DemoService, interface=com.alibaba.dubbo.demo.api.DemoService, version=0.0.0, timeout=5000}]], channel: /169.254.18.108:63462 -> /169.254.18.108:20880
	at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:101)
	at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:227)
	at com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:72)
	at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52)
	at com.alibaba.dubbo.common.bytecode.proxy0.getColor(proxy0.java)
	at com.alibaba.dubbo.demo.consumer.Consumer2.run(Consumer2.java:45)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2018-10-13 22:49:31.965, end time: 2018-10-13 22:49:36.994, client elapsed: 66 ms, server elapsed: 4962 ms, timeout: 5000 ms, request: Request [id=0, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=getColor, parameterTypes=[class com.alibaba.dubbo.demo.api.bean.Fruit], arguments=[Fruit(name=null, color=)], attachments={traceId=53feab28645f492baec2b8a185f1a1ca, path=com.alibaba.dubbo.demo.api.DemoService, interface=com.alibaba.dubbo.demo.api.DemoService, version=0.0.0, timeout=5000}]], channel: /169.254.18.108:63462 -> /169.254.18.108:20880
	at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.returnFromResponse(DefaultFuture.java:188)
	at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:110)
	at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:84)
	at com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker.doInvoke(DubboInvoker.java:96)
	at com.alibaba.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:144)
	at com.alibaba.dubbo.demo.filter.ConsumerTraceFilter.invoke(ConsumerTraceFilter.java:24)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:53)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:48)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:74)
	at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
	at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:77)
	... 8 more

以上程式碼為服務端的呼叫超時錯誤.

產生以上錯誤的主要原因是,服務端的處理時間過長,超過了客戶端呼叫的超時時間,客戶端超時丟擲了“com.alibaba.dubbo.remoting.TimeoutException”,關閉了連線通道,當server端處理結束後,再次向客戶端傳送資料的時候,發現通道已經關閉,則丟擲“java.nio.channels.ClosedChannelException”

    發生這類錯誤我們通常處理方式,主要還是要看一下server端超時的時間是否配置合理,檢查一下,為什麼server端的處理時間會超過我們的預估時間(timeout),保證業務能在超時時間內完成,如果業務確實需要更多時間,可適當延長超時時間

timeout 在consumer,provider兩端都可以配置,如果兩端都配置的情況下,consumer端的優先順序更高,所以有時候,我們看到,server端總的處理花費的時間並沒有大於所配置的timeout的時間,還是出現在上述的異常,那麼可以檢查一下,client端是不是配置了更端的超時時間,覆蓋了provider的配置所致。

另外Dubbo官方:“建議由服務提供方設定超時,因為一個方法需要執行多長時間,服務提供方更清楚,如果一個消費方同時引用多個服務,就不需要關心每個服務的超時設定。”

server端 timeout 在配置中為可選項,不配置的情況下預設值為1000毫秒!

 

希望對正在解決類似問題的你有幫助!!!