如何在Netty的onChannelFailure回调中区分不同的异常

时间:2017-06-23 10:06:36

标签: java netty

我正在使用Netty 4.1.12.Final编写一个HTTP客户端,我有单元测试来模拟HTTP服务器的崩溃,以便能够处理它。 我注意到,当它发生时,我的入站处理程序的exceptionCaught回调方法被调用:

java.io.IOException: Une connexion existante a dû être fermée par l’hôte distant
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(Unknown Source)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source)
at sun.nio.ch.IOUtil.read(Unknown Source)
at sun.nio.ch.SocketChannelImpl.read(Unknown Source)
at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1100)
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:372)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:123)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:644)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:579)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:496)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:458)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)

异常消息的英语等价物很可能是:

java.io.IOException: An existing connection was forcibly closed by the remote host

由于从我的入站处理程序的channelRead0方法抛出异常时也会调用此回调方法,所以我问了几个问题:

  • 我是否应该始终在exceptionCaught回调中将“IOException”视为“已收到”,以表明继续使用该频道没有意义?
  • 由于channelRead0被声明为抛出Exception,我是否应该捕获其中的所有IOException以确保在exceptionCaught回调中“接收”IOException时它与Channel有关?
  • 有没有办法知道exceptionCaught回调中的“收到”异常是否与I / O操作或处理程序操作有关?

感谢您的任何提示!

1 个答案:

答案 0 :(得分:0)

1)如果我们讨论的是TCP连接,那么每个IOException都会导致netty自动关闭连接,因为无法恢复。

2)我认为我完全不理解这个问题,因为通过exceptionCaught(...)方法传递的每个异常都与ctx.channel()

获得的频道有关。

3)总的来说,没有办法。如果它是一个TCP连接及其IOException并由实际传输触发,我们将关闭连接。