Java 如何区分Netty'中的不同例外情况;单通道故障回调

Java 如何区分Netty'中的不同例外情况;单通道故障回调,java,netty,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 su

我正在用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方法引发异常时也会调用此回调方法,因此我要问几个问题:

    <> LI>是否应该总是在被调用的异常中考虑一个IOExvices“接收”作为指示继续使用该信道没有意义?
  • 由于channelRead0被声明为抛出异常,我是否应该捕获其中的所有IOException,以确保在exceptionCaught回调中“接收”IOException时,它与通道相关
  • 有没有办法知道exceptionCaught回调中的异常“已接收”是否与I/O操作或处理程序操作有关
谢谢你的提示

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

2) 我想我不完全理解这个问题,因为通过
exceptionCaught(…)
方法传递的每个异常都与可通过
ctx.channel()获得的通道相关


3) 不,一般来说没有办法。也就是说,如果它是TCP连接,它是IOException,它是由实际传输触发的,我们将关闭连接。

我忘了在收到IOException时提到这一点:ctx.channel().isActive()、isOpen()、isRegistered()和.isWritable()都是“真的”,谢谢。是的,我说的是TCP连接。因此,因为ctx.channel().isActive()、isOpen()、isRegistered()和.isWritable()在exceptionCaught中都是“true”,这意味着在调用exceptionCaught之后,通道实际上是关闭的?