The WebSocket use case requires switching back and forth between blocking and non-blocking writes. (The API defines some writes as non-blocking and others as blocking and they can be called in any order).Not sure I understand why.
I am building on top of the Servlet 3.1 HTTP upgrade so I am using the ServletOutputStream in non-blocking mode so I can handle the non-blocking writes. For the blocking writes I have to make the non-blocking write appear to be blocking. For this I am using a Latch so the thread that initiates the write isn't released until the write completes. If it is a large write the container may need to call onWritePossible() several times before the write completes and the Latch can count down and the initiating thread released. This only works if multiple container threads can access the WriteListener.
Remy's explanation of why we have this restriction makes sense. The general case is a lot trickier than the WebSocket case above (and even in the WebSocket case I had to be pretty careful with the multiple threads). I am heading rapidly towards the conclusion that the WebSocket API can't be implemented in a container neutral manner (which I think is a real shame).
[servlet-spec users] [jsr340-experts] Re: NIO specification clarification