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