0

我刚刚将 projectreactor.io 从 reactor OLD升级:[core: 3.0.1 .RELEASE, netty: 0.5.2 .RELEASE] 到 reactor NEW [core: 3.0.4 .RELEASE, netty: 0.6.0 .RELEASE]。

我打开一个 TcpClient 连接并想稍后关闭它。

在我使用的版本中

tcpClient.shutdown();

断开我的客户端与服务器的连接。

新版本中是否有等效调用?我找不到一个!

我在创建我的 TcpClient 时得到的NettyInboundNettyOutboundtcpClient.newHandler(...)

  • .context().dispose()
  • .context().channel().disconnect()
  • .context().channel().close()
  • TcpResources.reset()

他们似乎都没有正确地完成这项工作。

我注意到.context().onClose(...)正在调用相应的 -callback 。但是经过一些额外的等待,服务器端会检查连接。服务器端是普通的 NIO2 而不是 reactor/netty,当客户端升级时,服务器端保持不变。

使用OLD客户端,我.isOpen() == false为服务器端的每个频道提供服务。

使用客户端,我可以获得.isOpen() == true服务器端的每个频道。大多数时候我什至可以写信给频道。.isOpen() == false一些通道在写入几个字节后切换到。

4

4 回答 4

0

使用 reactor-core: 3.1.0.M3 和 reactor-netty: 0.7.0.M1 客户端 API 得到了改进并且工作更可靠。
blockingNettyContext.shutdown()我仍然需要在服务器端进行以下解决方法以确保通道已关闭之后:
我需要写入通道并在异常时关闭它:

// channel.isOpen == true
try {
    channel.write(ByteBuffer.wrap("__test__".getBytes())).get();
} catch (ExecutionException e) {
    channel.close();
}
// channel.isOpen == false
于 2017-08-17T10:59:01.133 回答
0

这值得我认为特别是如果 channel().close() 和 reset() 不起作用的问题。否则,可能是由于默认池化并TcpClient.create(opts -> opts.disablePool())可能有所帮助,请告诉我们,如果您有机会在http://github.com/reactor/reactor-netty上发布问题,您将成为英雄:D

于 2017-02-07T09:52:11.483 回答
0

链接到这个未解决的问题https://github.com/reactor/reactor-netty/issues/15。我们将查看 dispose API。

于 2017-02-13T10:59:06.987 回答
0

以下代码以某种方式破坏了通道,但并未完全破坏。

ChannelFuture f = nettyContext.channel().close();
f.sync();

nettyContext.dispose();

问题是该通道似乎仍然在服务器端打开。对于基于 NIO2 的服务器,服务器不应测试通道是否为 isOpen()。总是如此。

作为一个肮脏的解决方法,服务器必须两次写入通道。如果它在第二次写入时捕获 ExecutionException,则该通道已被 Netty-TcpClient 关闭。

try {
    channel.write(ByteBuffer.wrap("hello".getBytes())).get();
    // No exception on first write but on second write.
    channel.write(ByteBuffer.wrap("bye".getBytes())).get();
} catch (ExecutionException e) {
    LOG.log(Level.SEVERE, "ExecutionException on writing from server into channel", e);
}
于 2017-02-13T21:48:29.693 回答