Structured message reading problem in Netty.
manishr22
manishr22 at gmail.com
Thu Apr 30 02:43:40 EDT 2009
Hi Trustin,
My decoder is :
//@ChannelPipelineCoverage("one") // tried with this option and by
commenting this
public class LoggingAgentMessageDecoder extends ReplayingDecoder<VoidEnum>/*
FrameDecoder */{
private int maxMsgLenToRead = 10000;
public static int flag = 0;
int messageLength = 0;
int headerLength = 0;
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel,
ChannelBuffer buffer, VoidEnum state) throws Exception {
ChannelBuffer frame = null;
BufferData bData = new BufferData(); // this class has three variable
// bodyLength : int
// headerLength : int
// buffer:
ChannelBuffer
// and their
getter-setter.
messageLength = buffer.readInt();
bData.setBodyLegth(messageLength);
headerLength = buffer.readInt();
bData.setHeaderLength(headerLength);
// return frame;
frame = buffer.readBytes(messageLength + headerLength);
bData.setBuffer(frame);
return bData;
// if (!readLength) {
// messageLength = buffer.readInt();
// headerLength = buffer.readInt();
// readLength = true;
// checkpoint();
// }
// if (readLength) {
// frame = buffer.readBytes(messageLength + headerLength);
// readLength = false;
// checkpoint();
//
// }
}
}
and my pipeline is:
@ChannelPipelineCoverage("all")
// tried will "one" option too
public class LoggingAgentNettyPipelineFactory extends SimpleChannelHandler {
private final ChannelHandler handler;
// private int port = 0;
public LoggingAgentNettyPipelineFactory(ChannelHandler handler) {
this.handler = handler;
}
// public LoggingAgentNettyPipelineFactory(final int port) {
// this.port = port;
// }
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = pipeline();
// LoggingAgentTCPNettyHandler handler = new
// LoggingAgentTCPNettyHandler(
// this.port);
pipeline.addLast("decoder", new LoggingAgentMessageDecoder());
pipeline.addLast("handler", this.handler);
return pipeline;
// Add the text line codec combination first,
// manish: 10000 is the maximum message size limit, this should pick
// // from constant file
// ChannelPipeline pipeline = pipeline();
// pipeline.addLast("framer",
// new DelimiterBasedFrameDecoder(
// Constants.LOG_AGENT_MAXIMUM_MSG_LEN, Delimiters
// .lineDelimiter()));
// pipeline.addLast("decoder", new StringDecoder("UTF-8"));
// pipeline.addLast("encoder", new StringEncoder("UTF-8"));
//
// // and then business logic.
// pipeline.addLast("handler", handler);
//
// return pipeline;
}
}
In my handler message received method is like :
@Override
public void messageReceived(ChannelHandlerContext ctx,
MessageEvent messageEvent) {
int len;
int header;
BufferData buffData = null;
if (messageEvent.getMessage() instanceof BufferData) {
buffData = (BufferData) messageEvent.getMessage();
}
len = buffData.getBodyLegth();
header = buffData.getHeaderLength();
ChannelBuffer buff = buffData.getBuffer();
byte[] bytesRead = new byte[buff.capacity()];
buff.readBytes(bytesRead);
// Other business logic.
}
Hope i am doing everything correctly. Your advice will be highly
appreciated.
Regadrs,
Manish
Trustin Lee wrote:
>
> Hi Manish,
>
> Could you paste your decoder implementation and pipeline setup?
>
> Thanks in advance,
> Trustin
>
>
> manishr22 wrote:
>>
>> Hi Trustin,
>>
>> One small question:
>>
>> When I am doing the implementation the way you said like adding
>> ReplayDeocder, if i run whatever be the number of client with number of
>> messages from each, I see the first message from client read correctly
>> but from second message the header length and message lengh data read
>> incorrectly and then application crashes.
>>
>> Though i tested my application with the use of
>> "DelimiterBasedFrameDecoder" i see for all client i get correct data.
>> Since the string based delimiter in serialization and de-serialization
>> from string to byte and then int gives incorrect result.
>>
>> So i should be following the approach of ReplayingDecoder only but due to
>> above given problem i am facing issue.
>> In replayingDecoder i tried with the method checkPoint() too. I think
>> everytime when data is read from channelBuffer the readerIndex() value
>> increase. so checkpoint() here shouldn't be necessary. Though i am
>> compromising with the performance for sometime so that same data get read
>> again and again for the time being.
>>
>> IF first message read correctly it should happen for rest messages too.
>>
>> i have tried for @ChannelPipelineCoverage("all") and
>> @ChannelPipelineCoverage("one") both. but the problem is same.
>>
>> Any suggestion?
>>
>> Regards
>> Manish Ranjan
>>
>> manishr22 wrote:
>>>
>>> Hi Trustin,
>>>
>>> Thanks for your guidance. This should help me out to solve my problem.
>>> You people of created a great library, just more of documentation and
>>> example will help any developer a lot to use Netty.
>>>
>>> Regards
>>> Manish
>>>
>>>
>>> Trustin Lee-2 wrote:
>>>>
>>>> Hi Manish,
>>>>
>>>> I hope you are not discouraged by previous comment.
>>>>
>>>> I'd like to recommend you to use ReplayingDecoder in this case.
>>>>
>>>> public class MyDecoder extends ReplayingDecode<VoidEnum> {
>>>> @Override
>>>> protected Object decode(..., buf, ...) {
>>>> int messageLength = buf.readInt();
>>>> int headerLength = buf.readInt();
>>>> return buf.readBytes(messageLength + headerLength);
>>>> }
>>>> }
>>>>
>>>> Than the handler placed after 'MyDecoder' will get a ChannelBuffer
>>>> with expected length. For example, if a message whose messageLength
>>>> is 10 and headerLength is 6, you will get a ChannelBuffer whose
>>>> readable bytes are 4 + 4 + 6 + 10.
>>>>
>>>> Let me know if you have more questions. :)
>>>>
>>>> HTH,
>>>>
>>>> — Trustin Lee, http://gleamynode.net/
>>>>
>>>> On Fri, Apr 24, 2009 at 2:16 PM, manishr22 <manishr22 at gmail.com> wrote:
>>>>>
>>>>> Hi Trustin,
>>>>>
>>>>> Sorry to bug you guys much.
>>>>>
>>>>> I did read the explanation about FrameDecoder and did the earlier
>>>>> implementation using the same. In my earlier post i gave those source
>>>>> code
>>>>> too. Since that was also having problem in buffer's capacity() and
>>>>> resetReaderIndex().
>>>>>
>>>>> I am sorry to give an impression like i wanted to get my code fixed by
>>>>> someone else, but i never had this intention, i only wanted to get the
>>>>> advice and opinion from Netty expert, since i was learning this.
>>>>>
>>>>> Regards
>>>>> Manish
>>>>>
>>>>> Trustin Lee-2 wrote:
>>>>>>
>>>>>> Hi Manish,
>>>>>>
>>>>>> Looking from your code, you don't have a FrameDecoder or
>>>>>> ReplayingDecoder in a pipeline, which means you have a good chance to
>>>>>> receive only partial data, which leads to IndexOutOfBoundsException.
>>>>>> Did you have a chance to read the first chapter of the user guide?
>>>>>> There's good amount of explanation about this issue there.
>>>>>>
>>>>>> You and other community members have exchanged quite a lot of
>>>>>> questions and answers so far. My impression so far is that you just
>>>>>> want people to fix your code. We could solve your problem just by
>>>>>> writing the fixed code for you, but it would be much better for you
>>>>>> to
>>>>>> follow all the step demonstrated in the user guide. Then you will
>>>>>> know what is wrong with your current code very easily.
>>>>>>
>>>>>> Also, you might find the factorial example more useful than the
>>>>>> discard example for your case.
>>>>>>
>>>>>> — Trustin Lee, http://gleamynode.net/
>>>>>>
>>>>>> On Thu, Apr 23, 2009 at 8:45 PM, manishr22 <manishr22 at gmail.com>
>>>>>> wrote:
>>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> I am new to netty and tried writing netty-server as per my
>>>>>>> requirement
>>>>>>> seeing various examples. But i am not getting the result correctly.
>>>>>>>
>>>>>>>
>>>>>>> I am trying to write a netty server that can read the that will read
>>>>>>> the
>>>>>>> message-structre from normal synchronous multi-threaded client ( say
>>>>>>> 10
>>>>>>> client is sending 1000 messages each ) to the server.
>>>>>>>
>>>>>>>
>>>>>>> By message structure i mean my client is sending the message in the
>>>>>>> format :
>>>>>>>
>>>>>>>
>>>>>>> [MESSAGE 1-CLIENT 1] message-length(first 4 byte) header
>>>>>>> length(next 4
>>>>>>> byte) data (including
>>>>>>>
>>>>>>> header and body as specified bytes of message length and header
>>>>>>> length)
>>>>>>>
>>>>>>>
>>>>>>> [MESSAGE 2-CLIENT 1] message-length(first 4 byte) header
>>>>>>> length(next 4
>>>>>>> byte) data (including
>>>>>>>
>>>>>>> header and body as specified bytes of message length and header
>>>>>>> length)
>>>>>>>
>>>>>>>
>>>>>>> ........
>>>>>>>
>>>>>>> ........
>>>>>>>
>>>>>>> [MESSAGE 1-CLIENT 2] message-length(first 4 byte) header
>>>>>>> length(next 4
>>>>>>> byte) data (including
>>>>>>>
>>>>>>> header and body as specified bytes of message length and header
>>>>>>> length)
>>>>>>>
>>>>>>>
>>>>>>> [MESSAGE 2-CLIENT 2] message-length(first 4 byte) header
>>>>>>> length(next 4
>>>>>>> byte) data (including
>>>>>>>
>>>>>>> header and body as specified bytes of message length and header
>>>>>>> length)
>>>>>>>
>>>>>>> ....
>>>>>>> .....
>>>>>>>
>>>>>>> [For N number of client and N
>>>>>>> http://n2.nabble.com/file/n2682454/netty.zip
>>>>>>> netty.zip number of messages]
>>>>>>>
>>>>>>> and now my netty server should read all the different messages from
>>>>>>> client/s
>>>>>>> and do the proper message parsing and do some business operation.
>>>>>>>
>>>>>>>
>>>>>>> How i can implement the reading of message-structure using netty.
>>>>>>>
>>>>>>>
>>>>>>> I saw several example and implemented something in it. but its not
>>>>>>> giving
>>>>>>> the appropriate result rather i am getting exception all the time.
>>>>>>>
>>>>>>> The basic source code which i tried for this is also attached for
>>>>>>> reference.
>>>>>>>
>>>>>>> Any suggestion and help with some sample code will be really
>>>>>>> appreciated.
>>>>>>>
>>>>>>>
>>>>>>> Regards
>>>>>>>
>>>>>>> Manish
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> View this message in context:
>>>>>>> http://n2.nabble.com/Structured-message-reading-problem-in-Netty.-tp2682454p2682454.html
>>>>>>> Sent from the Netty User Group mailing list archive at Nabble.com.
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> netty-users mailing list
>>>>>>> netty-users at lists.jboss.org
>>>>>>> https://lists.jboss.org/mailman/listinfo/netty-users
>>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> netty-users mailing list
>>>>>> netty-users at lists.jboss.org
>>>>>> https://lists.jboss.org/mailman/listinfo/netty-users
>>>>>>
>>>>>>
>>>>>
>>>>> --
>>>>> View this message in context:
>>>>> http://n2.nabble.com/Structured-message-reading-problem-in-Netty.-tp2682454p2689756.html
>>>>> Sent from the Netty User Group mailing list archive at Nabble.com.
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> netty-users mailing list
>>>>> netty-users at lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/netty-users
>>>>>
>>>>
>>>> _______________________________________________
>>>> netty-users mailing list
>>>> netty-users at lists.jboss.org
>>>> https://lists.jboss.org/mailman/listinfo/netty-users
>>>>
>>>>
>>>
>>>
>>
>>
>
>
--
View this message in context: http://n2.nabble.com/Structured-message-reading-problem-in-Netty.-tp2682454p2745448.html
Sent from the Netty User Group mailing list archive at Nabble.com.
More information about the netty-users
mailing list