users@grizzly.java.net

Re: Grizzly problem when end of query not found in ProtocolParser

From: Oleksiy Stashok <Oleksiy.Stashok_at_Sun.COM>
Date: Wed, 09 Jul 2008 18:08:26 +0200

Thanks.

I see problem in hasMoreBytesToParse method. It should return false if
message was not read completely. Your implementation returns true.
hasMoreBytesToParse should return true only in case, when you
succeeded to read and parse complete message, but there is some
remaining data, which eventually belongs to the next message.
Otherwise it should return false.

Also you may want to add some logic before reallocating the ByteBuffer
in the hasNextMessage method. Because fact, that [eoq] was not found
doesn't mean, than ByteBuffer is too small - you can check whether
it's full right now or not - and reallocate only if it's full.

Hope this will help.

WBR,
Alexey.

On Jul 9, 2008, at 17:29 , Survivant 00 wrote:

> it's only a demo, so I could put a max length.. and choose a fixed
> header too, but I want to keep it more dynamic. There will be a MAX
> lenght.. we don't want to parse to the infiny.. like a message over
> 5000 bytes and didn't find a valid query in buffer.. that mean that
> the client send crap.. so we must close is connection.
>
> I post the first implementation in grizzly of my demo.
>
> I think that I just didn't start with the right example.
>
>
> 2008/7/9 Oleksiy Stashok <Oleksiy.Stashok_at_sun.com>:
> Hi,
>
> do you have any limit on incoming message size? It could make code
> easier and more optimal, because you'll avoid ByteBuffer reallocation.
> otherwise the code part you posted here looks good, can you pls.
> attach whole parser implementation, may be it's something wrong in
> other parts?
>
> Thanks.
>
> WBR,
> Alexey.
>
>
> On Jul 6, 2008, at 12:27 , Survivant 00 wrote:
>
> I'm trying to create a custom ProtocolParser. The problem is when
> we don't find 'EOQ' in the buffer, I want to put the buffer back
> into grizzly and do a loop again to see if the string will be find
> the next time.
>
> but it's only loop once.. maybe I started from the wrong sample. I
> think I have to move my login into hasMoreBytesToParse .. and use
> startBuffer to get the bytebuffer from grizzly and when the OEQ in
> not found in hasMoreBytesToParse, I put the buffer back into grizzly
> by workerThread.setByteBuffer(savedBuffer); where savedBuffer is
> the buffer receive in the startBuffer ?
>
> here a sample of my code that doesn't work.. just want to confirm if
> my previous tought were OK.
>
> but it's stop at : hasMoreBytesToParse the second time.
>
> listening for incomming TCP Connections on port : 5000
> isExpectingMoreData
> hasMoreBytesToParse
> startBuffer
> hasNextMessage
> msg=sa [19~ [19~
> hasMoreBytesToParse
>
> here what I have
>
> // method after hasMoreBytesToParse if it's true
> public void startBuffer(ByteBuffer bb) {
> System.out.println("startBuffer");
> if (debug) System.out.println("startBuffer / bb = " + bb);
> savedBuffer = bb;
> savedBuffer.flip();
> if (debug) System.out.println("startBuffer / bb = " +
> savedBuffer);
> if (debug) printByteBuffer();
> limit = savedBuffer.limit();
> //partial = false;
> }
>
>
> public boolean hasNextMessage() {
> System.out.println("hasNextMessage");
>
> String query = null;
> if (debug) System.out.print("hasNextMessage() before
> savedBuffer = " + savedBuffer);
> if (debug) printByteBuffer();
> if (savedBuffer == null) return false;
> if (savedBuffer.hasRemaining()) {
>
> // decode the buffer
> String msg=null;
> try {
> msg = f_asciiDecoder.decode(savedBuffer).toString();
> } catch (CharacterCodingException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
>
> System.out.println("msg=" + msg);
>
> int index = msg.indexOf("[eoq]");
> if(index>-1){
>
> query = msg.substring(0,index);
> //System.out.println("Query = " + query);
>
> // We need to kept what is after the EOQ
> f_cumulatifBB.clear();
> f_cumulatifBB.put(msg.substring(index +
> "[eoq]".length()).getBytes());
>
> WorkerThread workerThread = (WorkerThread)
> Thread.currentThread();
> workerThread.setByteBuffer(f_cumulatifBB);
> partial = false;
> } else {
> //System.out.println("no EOQ in this iteration");
> int newCapacity = savedBuffer.capacity() + LIMITBB;
> ByteBuffer newBuffer =
> ByteBufferFactory.allocateView(newCapacity, savedBuffer.isDirect());
> newBuffer.put(savedBuffer);
> WorkerThread workerThread = (WorkerThread)
> Thread.currentThread();
> savedBuffer = newBuffer;
> workerThread.setByteBuffer(savedBuffer);
>
> partial = true;
> }
>
> }
> if (debug) System.out.println("hasNextMessage() result = " +
> partial);
> return !partial;
> }
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_grizzly.dev.java.net
> For additional commands, e-mail: users-help_at_grizzly.dev.java.net
>
>
> <
> nio_quotegw_demo_v3
> .zip
> >---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_grizzly.dev.java.net
> For additional commands, e-mail: users-help_at_grizzly.dev.java.net