写完回复后立即关闭通道

时间:2013-05-26 04:51:18

标签: java netty

如果我在写完回复后立即关闭频道会怎样?答复是否仍在提供?

http upload example似乎在说,但我不确定这只是一个错误。

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

2 个答案:

答案 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,所以您可能需要搜索类似于上面的内容。