Jon Chambers
Jon Chambers

Reputation: 664

When does a Netty ChannelFuture for a write operation become "done?"

In Netty 4, when, exactly, does the ChannelFuture for a write operation (let's say to an NioSocketChannel) become "done?" Does Netty wait for an ACK packet? Is there any interdependence between the input and output handlers in a ChannelPipeline in terms of marking write futures as done?

Upvotes: 3

Views: 1872

Answers (1)

Dev
Dev

Reputation: 12206

Netty does not wait for ACK packets. ACK packets are an implementation detail of TCP that is mostly (entirely? yes in java, but not sure about socket api's in C) hidden to the application using a socket. If you need to know when messages are delivered you should add an acknowledge component to your application layer protocol.

In Netty 3.x, Netty would call the success method (and notify listeners) on a ChannelFuture after the given message was written to the socket. I'm not as familiar with the Netty 4 implementation details, but from my tracing though the source I believe this is also true in Netty 4.

ChannelOutboundBuffer.remove() @ ChannelOutboundBuffer.java:263 sets the success of the future and is called by NioSocketChannel.doWrite(ChannelOutboundBuffer) @ NioSocketChannel.java:264 after a message is done being written to the socket.

Note that being written to the socket doesn't necessarily mean the message has been sent (partially or entirely), only that it has been written to the send buffer for the socket in the TCP layer.

Upvotes: 4

Related Questions