Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在写入响应后立即关闭通道_Java_Netty - Fatal编程技术网

Java 在写入响应后立即关闭通道

Java 在写入响应后立即关闭通道,java,netty,Java,Netty,如果在写入响应后立即关闭通道会发生什么?答复是否仍然有效 这似乎是这么说的,但我不确定这是否只是一个bug writeResponse(ctx.channel()); ctx.channel().close(); 不,这不是一个bug,但不是关闭通道的最佳方式,我假设您编写响应的执行方式如下: ctx.channel().write(msg) 它是异步发送的,实际上消息将提供给writeBufferQueue,写入IO线程将被唤醒以执行实际写入 检查ctx.channel()返回的Chann

如果在写入响应后立即关闭通道会发生什么?答复是否仍然有效

这似乎是这么说的,但我不确定这是否只是一个bug

writeResponse(ctx.channel());
ctx.channel().close();

不,这不是一个bug,但不是关闭通道的最佳方式,我假设您编写响应的执行方式如下:

ctx.channel().write(msg)
它是异步发送的,实际上消息将提供给writeBufferQueue,写入IO线程将被唤醒以执行实际写入

检查ctx.channel()返回的
ChannelFuture
。write(msg),您可以等待该对象

我认为,关闭网络频道的最佳方式是:

ctx.channel().write(a emptybuffer).addFutureListener(Channels.CloseFuture);

由于您使用的是netty 4.0,您可能需要搜索与上面类似的内容。

如果您在写入后立即使用
.close()
关闭一个频道,则根据消息的长度,您将在中创建一个包含所有写入数据、一半数据或甚至没有数据的竞争条件

之所以会发生这种情况,是因为所有写入的消息都会进入一个队列,并且取决于当前线程是否为Netty线程,它要么处理数据目录,要么只是返回

由于在大多数情况下,您只希望在所有写入操作完成后关闭通道,因此在写入响应时应使用以下代码:

ctx.writeAndFlush(protocolSpecificPacket)
.addListener(ChannelFutureListener.CLOSE);
虽然这始终有效,但您并不总是有权访问最后一次写入,在这种情况下,您还可以发送一个空的
ByteBuf
,然后将侦听器添加到其中:

ctx.writeAndFlush(未冷却的空\u缓冲区)
.addListener(ChannelFutureListener.CLOSE);