如果我在写完回复后立即关闭频道会怎样?答复是否仍在提供?
这http upload example似乎在说,但我不确定这只是一个错误。
writeResponse(ctx.channel());
ctx.channel().close();
答案 0 :(得分:1)
如果您在写入后立即使用.close()
关闭某个频道,则会创建一个竞争条件,其中包括所有数据的写入,一半数据,甚至没有,具体取决于消息的长度。
这是因为所有写入的消息最终都会进入队列,并且根据当前线程是否是Netty线程,它会处理数据目录,或者只是返回。
由于在大多数情况下您只想在所有写入完成后关闭通道,因此在编写响应时应使用以下代码:
ctx.writeAndFlush(protocolSpecificPacket)
.addListener(ChannelFutureListener.CLOSE);
虽然这总是有效,但你并不总是能够访问最后一次写入,在这些情况下你也可以发送一个空ByteBuf
,然后将监听器添加到:{/ p>
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)
.addListener(ChannelFutureListener.CLOSE);
答案 1 :(得分:-1)
不,这不是一个错误,但不是关闭频道的最佳方式,我假设你写的响应是这样的:
ctx.channel().write(msg)
它是异步发送的,实际上该消息将提供给writeBufferQueue,并且写入IO线程将被唤醒以进行实际写入。
检查ctx.channel()返回的ChannelFuture
。write(msg),你可以等待那个对象。
我认为关闭网络频道的最佳方法是:
ctx.channel().write(a emptybuffer).addFutureListener(Channels.CloseFuture);
因为您使用的是netty 4.0,所以您可能需要搜索类似于上面的内容。