Thanks for the speedy reply, Mark.

I have thought about that code for a minute. You're right; what it does is
construct the entire
message in memory.  My use case has no use for partials and the message
sizes are
tens to hundreds of Kb.  Didn't mean to defeat anything there, just the use
case.

If there is a way to change the default min size of a whole message, that
would certainly be
the way to go,---another right for you.  There's only one problem: I don't
know how.
Do you?

-Igor.


On Mon, Sep 23, 2013 at 3:39 AM, Mark Thomas <ma...@apache.org> wrote:

> On 22/09/2013 21:49, Igor Urisman wrote:
>
> > However, the server implementation is free to pick the maximum size of a
> > payload
> > that it is willing to receive as a whole.  Tomcat designers chose that
> size
> > to be 125
> > bytes.  Reasonable number given the particulars of the wire level
> protocol,
> > but not
> > one defined in the standard.
>
> That statement not correct. The default incoming buffer size for text
> and binary messages is 8k bytes. This applies to both the client and the
> server.
>
> There is a specification (RFC6455) mandated limit on control message
> payloads of 125 bytes.
>
> > It appears that there's also a talk of exposing the inbound message via a
> > Reader <
> http://www.oracle.com/technetwork/articles/java/jsr356-1937161.html>but
> > that's not in Java EE 7.
>
> Another incorrect statement. MessageHandler.Whole<Reader> is supported
> in JSR-356. Note that Readers only work with whole messages, not partial
> ones.
>
> > So, just as a specific example, my implementation looks like the
> following:
> >
> > public class FermiMessageHandler implements
> MessageHandler.Partial<String> {
> >
> >     private Session session;
> >     private int maxMessageSize = 20000;
> >     private StringBuilder messageBuffer = new
> StringBuilder(maxMessageSize);
> >
> >     FermiMessageHandler(Session session) {
> >         this.session = session;
> >     }
> >
> >     @Override
> >     public void onMessage(String msgPart, boolean last) {
> >         if( messageBuffer.length() + msgPart.length() > maxMessageSize) {
> >             session.close(new
> > CloseReason(CloseReason.CloseCodes.CLOSED_ABNORMALLY, "Message is too
> > long");
> >         }
> >         else {
> >             messageBuffer.append(msgPart);
> >             if (last) {
> >                 String message = messageBuffer.toString();
> >                 // We have a complete message.  Do something with it.
> >                 messageBuffer.setLength(0);
> >             }
> >         }
> >     }
> > }
>
> Just think about what you have done for a minute. The whole point of
> partial messages is so that you don't have to buffer the entire message
> in memory before processing it. Your code defeats the point of that
> entirely. You'd be better off increasing the maximum message size
> supported by the implementation and using MessageHandler.Whole<String>.
> Better still would be to re-write your handler so it actually processed
> partial messages.
>
> Mark
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: users-h...@tomcat.apache.org
>
>

Reply via email to