Async channels
Alan Bateman
Alan.Bateman at Sun.COM
Mon Apr 20 05:06:07 PDT 2009
Rémi Forax wrote:
> As a server developer; I prefer the semantics of
> getSocketRemoteAddress() (as specified now)
> to the one specified for getRemoteAddress().
> At least half of the usages (and perhaps more) of getRemoteAddress()
> will be for logging purpose,
> having the remote address persistent even if the channel is closed
> seems important to me,
> for example, if you want to log that the channel is closed :)
Just so we're clear, this relates to the channel state (not the
connection state). If the connection terminates or is closed by the peer
then getRemoteAddress will continue to return the peer address until you
close the channel. All I/O operations on channels throw
ClosedChannelException is invoked on a closed channel. On a technical
note, there are some operating systems where getpeername/equivalent
fails once the connection has closed; ports to those platforms will have
no choice but to attempt to retrieve (and cache) the peer information
when the connection is established (or accepted).
As to the logging case - if you asynchronously close a channel with
outstanding I/O operations and the completion handler attempts to log
information (that includes the peer address that is no longer valid)
then handler will need code to deal with this case.
> Argh,
> I was hoping that SecurityException like any runtime exceptions is
> thrown synchronously.
> I don't see why they have to be delayed.
> As a developer, runtime exception means you don't correctly
> understand the spec
> so they have to be thrown sooner than later (if possible).
The permission checks required to accept a connection or receive a
datagram cannot be done at the time that the I/O operations are initiated.
> :
> I think I don't like the fact that runtime exceptions can be:
> 1) thrown by read/write/accept/connect or
> 2) catch by the completion handler
> without be able to understand/predict why.
The only runtime exception that the completion handler has to deal with
is a SecurityManager and only then if there is a security manager and
only for specific I/O operations.
> :
> Perhaps a test case is missing ?
Yes, the current tests don't check that you can continue to write after
cancelling a read (and vis versa). I'll add these tests. Thanks again
for finding this one.
> Taking an Executor an not a AsyncChannelGroup doesn't prevent sharing.
> Currently, you can write:
>
> ExecutorService executor=Executors.newCachedThreadPool();
> AsynchronousChannelGroup channelGroup =
> AsynchronousChannelGroup.withThreadPool(executor);
> AsynchronousServerSocketChannel serverSocketChannel =
> AsynchronousServerSocketChannel.open(channelGroup);
> AsynchronousFileChannel fileChannel =
> AsynchronousFileChannel.open(path, openOptions, executor);
You could but this goes against the warning in the spec that the thread
pool is intended to be used exclusively by the resulting group.
>
>
> Another questions, currently the linux code for asynchronous I/O is
> based on poll
> like the selectors.
Linux is the one case where we use the same I/O facility as we do in the
Selector. Selector uses is in simple level-triggered mode like poll.
Asynchronous I/O uses it in one-shot mode. The useful thing about the
new API is that is it mappable to broad range of I/O facilities.
> - On linux, is it more inetrresting to use async calls or selectors
> beside the fact that
> code with async calls seem simplier to write (at least to me) ?
Yes, the new API is easier but there are many things to size up (Reactor
vs. Proactor design for example). Jean-Francois might want to jump in
here as he has seeing better performance with his Grizzly port to the
new API.
> - Is there a plan to use really async I/O on linux ?
If Linux were get such a facility then we would use it. In the interim
we might port to Kevents if that goes into the kernel.
-Alan.
More information about the nio-dev
mailing list