当前位置: 首页 > 知识库问答 >
问题:

NettyChannelFuture.operationComplete()不会在IOException上调用

萧卜霸
2023-03-14

我正在测试连接失败期间客户端服务器的处理。

在客户端,当我从客户端向服务器发送消息时,拔下LAN电缆,我的ChannelFuture(如下)没有被调用。我所期望的是,我的通道将来会发现这个异常,这样我就可以在操作完成时处理它。

相反,它只会在客户端管道中的最后一个上游处理程序中被捕获。我做错了什么吗?或者也许这是Netty 3.2.4的问题?

当我拔下LAN电缆时,处理程序中出现异常:

    java.io.IOException: An existing connection was forcibly closed by the remote host
        at sun.nio.ch.SocketDispatcher.read0(Native Method)
        at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25)
        at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:198)
        at sun.nio.ch.IOUtil.read(IOUtil.java:166)
        at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:243)
        at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:321)
        at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:280)
        at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:200)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)

我的频道未来:

    ChannelFuture future = Channels.write(channel, message);
    future.addListener(new ChannelFutureListener() {

           @Override
           public void operationComplete(ChannelFuture future) throws Exception {
               if (!future.isSuccess()) {
                   LOG.error("Client failed to send message", future.getCause());
                   future.getChannel().close();
               }
           }
    });

共有1个答案

孔理
2023-03-14

从堆栈上看,写入似乎已成功完成。尝试读取通道时引发异常。如果您对这种异常感兴趣,您需要实现自己的SimpleChannelUpstreamHandler并覆盖exceptionCaught(..)方法。

请务必将处理程序添加到通道管道。

 类似资料:
  • 我在尝试写入谷歌商店时得到一个IOException 堆栈跟踪已连接 代码如下 我正在使用App Engine SDK 1.6.4 谢谢

  • 我正在尝试通过蓝牙打印到热敏打印机。 我以前能够在Nexus 7设备(第一代和第二代)上成功打印。然而,当我将完全相同的代码复制粘贴到不同的应用程序上,并将其部署到华硕平板电脑上时,我突然得到一个,告诉我我的套接字可能已关闭。 这是我的代码: 这里是来自try-cat块的错误: 现在我很困惑,为什么当我所做的只是将代码部署到不同的设备上时会突然出现错误。 我该如何进行?

  • 问题内容: 我想将android模拟器上的数据发送到本地主机网络,并获得一些结果。 这是例外。 为什么这么说呢?有人可以帮我吗?提前致谢。 问题答案: 它是一个已知的错误,在将来的版本中已修复。 http://code.google.com/p/android/issues/detail?id=12724 最简单的解决方法是对URL使用不同的构造函数。该结构接受主机名,端口和文件 编辑 在您的情况

  • 问题内容: 我有一个带有可观察列表的ComboBox,该列表随用户键入字符或进行选择而更新。当我从ComboBox中选择一个项目并调用我的侦听器事件,然后从ComboBox的ObservableList中调用clear()方法时,引起了我遇到的问题。 完整代码 现在,当我收到错误消息时,ObservableList会按原样出现,但我仍然收到此异常。尝试调试此错误导致我的IDE在调用setAll(运

  • 我想调用AZDO来获取一个测试计划,但当我尝试时,这返回了一个IOException,我不知道为什么 这是stacktrace 调试[org.apache.http.client.protocol.requestAddCookies]CookieSpec选定:默认调试[org.apache.http.client.protocol.requestAuthCache]Auth缓存未在上下文中设置调试

  • 我是spring webflux和reactor的新手,我希望在发生某些特定异常时有一个回退机制,根据我的研究,onErrorResume方法可以做到这一点,但它不会被调用,我得到500个内部服务器错误,而不是触发回退并阻止此错误。 注意:我使用Spring网络流量,这意味着它在Reactor项目的正常行为中做了一些改变 这是堆栈跟踪