RFR JDK-8087113: Websocket API and implementation

Chris Hegarty chris.hegarty at oracle.com
Wed Apr 6 08:59:16 UTC 2016


On 6 Apr 2016, at 09:37, Simone Bordet <simone.bordet at gmail.com> wrote:

> Hi,
> 
> On Tue, Apr 5, 2016 at 11:06 PM, Pavel Rappo <pavel.rappo at oracle.com> wrote:
>> Let's suppose we have a ByteBuffer to send. This ByteBuffer contains 1 MB of
>> data, the socket send buffer is 16 KB, the network is not particularly fast.
>> Suppose then the first pass fills the full buffer's 16Kb completely. So
>> WebSocket has 1,048,576 - 16,384 bytes left to write, but the buffer is still
>> full.
>> 
>> What should I do next in order to be nonblocking within this invocation?
> 
> You write what you can, store in some data structure the buffer,
> register for write interest in NIO, and then return the CF.
> When NIO calls you back telling it's write ready, you write some more.
> Rinse & repeat until you have written everything, at which point you
> notify the CF.

Got it. That could be reasonable.

I note that Pavel used a permits size greater than 1, but the API has a 
single-outstanding-write policy ( ISE is thrown if sendXXX is called before
the previous message was sent ). Maybe this is where some of the confusion 
/ complexity around the implementation comes from. What you are suggesting
sounds very reasonable for a single-outstanding-write, where you know you 
can always attempt to write to the socket.   If this policy was to be revisited
then it is somewhat less attractive, it is more opportunistic.  I have no reason
to think that this API choice would be revisited, just that it may explain where
we are today.

>> Sorry Simone, which thread pool are you talking about? In case you meant
>> SignalHandler, it doesn't have a queue. It's built on "opportunistic" repeating
>> of the same task over and over again.
> 
> I mean the Executor you get from HttpClient.
> Executors have a queue.
> 
>> May I ask in what thread you think WebSocket.Listener's invocations should be
>> dispatched?
> 
> IMHO they should not be dispatched. You just call WebSocket.Listener
> methods from the thread that performed the read.
> 
>> On another topic. Let's consider many different WebSocket connections have been
>> established simultaneously. But the nature of these connection such that they
>> are all different in their speed. How would you suggest one should organize and
>> scale this?
> 
> You have to define what you mean by "organize and scale", and what is
> the real problem you are trying to solve.
> I would not start worrying about this until the implementation is
> simple and efficient.

-Chris.



More information about the net-dev mailing list