You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@mina.apache.org by boB Gage <bg...@ekosystems.com> on 2008/12/29 21:50:54 UTC
Issue with VmPipeAddress
I've got a Mina application going that communicates with a variety of
devices through both serial and network interfaces.
Part of this application is data-set simulations (ie fake far-end
devices) handled by using VmPipeAddress and VmPipeConnector objects.
My data simulator puts data into the stream via session.write() calls;
my "normal" decoders pick up that data as if it had come from a real device.
This set of objects works to an extent. BUT.... data that is sent
via two consecutive session.write() calls does NOT show up as expected
in the decoder.
For example, assume a decoder that wants packets delimited by 0x01
(start) and 0xFF (end)
session.write(0x01 02 03 04 05) followed by
session.write(0x06 07 08 09 FF)
Generates two calls to "decode" in the decoder object.
The first with five bytes 0x01 02 03 04 and 05 returns NEED_DATA because
the 0xFF end is not seen
The second with 5 bytes 0x06 07 08 09 FF returns NOT_OK because there is
no 0x01 start byte.
I would have expected two calls, but different parameters:
First with 0x01 02 03 04 05 which would return NEED_DATA.
The second with 0x01 02 03 04 05 06 07 08 09 FF which would return OK
(after parsing) because it had a full packet.
Am I suffering from unrealistic expectations?? Is this a known Mina
bug??? Have I just done something stupid???
Thanks in advance,
boB
Re: Issue with VmPipeAddress
Posted by boB Gage <bg...@ekosystems.com>.
Thanks Maarten!
But that answer just confuses me more....
Our decoder tests have always arbitrarily chunked data into random-sized
blocks before calling the Decoders' decode() method. These tests have
been working for quite some time.
It is only the VmPipe connection (simulated data sets) that we are
seeing this issue on (and if I trusted my memory half as much as my
logic I'd swear this *used to* work -- maybe that changed when I
upgraded to M2?).
Our Decoders have been MessageDecoders (descendants of
MessageDecoderAdapter) that have been chained in via
DemuxingProtocolCodecFactory-descendants calling their
'addMessageDecoder()' one or more times to define a protocol.
Switching decoders to ProtocolDecoders (descended from
CumulativeProtocolDecoder) means I can no longer use the same
CodecFactory mechanisms, nor can I have multiple decoders (say for
different packet types) within a single protocol. Is this a necessary
re-write that I should just get through now rather than later, or is
there a better solution???
Each protocol is currently defined via:
* One or more Decoders (extends MessageDecoderAdapter)
* One or more Encoders (implements MessageEncoder<T>)
* One Handler (extends IoHandlerAdapter)
* One Codec Factory (extends DemuxingProtocolCodecFactory)
boB
Maarten Bosteels wrote:
> Hi boB,
>
> What you describe is the expected behaviour :-)
> You're decoder is notified whenever new data arrives. Accumulating this
> data (when necessary) is the responsibility of the decoder.
>
> Usually the easiest thing to do is extending CumulativeProtocolDecoder.
>
> http://mina.apache.org/report/trunk/apidocs/org/apache/mina/filter/codec/CumulativeProtocolDecoder.html
>
> Also have a look at
> http://mina.apache.org/tutorial-on-protocolcodecfilter-for-mina-2x.html
>
> Maarten
>
>
> On Mon, Dec 29, 2008 at 9:50 PM, boB Gage <bg...@ekosystems.com> wrote:
>
>
>> I've got a Mina application going that communicates with a variety of
>> devices through both serial and network interfaces.
>>
>> Part of this application is data-set simulations (ie fake far-end devices)
>> handled by using VmPipeAddress and VmPipeConnector objects.
>>
>> My data simulator puts data into the stream via session.write() calls; my
>> "normal" decoders pick up that data as if it had come from a real device.
>>
>> This set of objects works to an extent. BUT.... data that is sent via
>> two consecutive session.write() calls does NOT show up as expected in the
>> decoder.
>>
>> For example, assume a decoder that wants packets delimited by 0x01 (start)
>> and 0xFF (end)
>>
>> session.write(0x01 02 03 04 05) followed by
>> session.write(0x06 07 08 09 FF)
>>
>> Generates two calls to "decode" in the decoder object.
>> The first with five bytes 0x01 02 03 04 and 05 returns NEED_DATA because
>> the 0xFF end is not seen
>> The second with 5 bytes 0x06 07 08 09 FF returns NOT_OK because there is no
>> 0x01 start byte.
>>
>> I would have expected two calls, but different parameters:
>> First with 0x01 02 03 04 05 which would return NEED_DATA. The second with
>> 0x01 02 03 04 05 06 07 08 09 FF which would return OK (after parsing)
>> because it had a full packet.
>>
>>
>> Am I suffering from unrealistic expectations?? Is this a known Mina bug???
>> Have I just done something stupid???
>>
>>
>> Thanks in advance,
>> boB
>>
>>
>>
>
>
Re: Issue with VmPipeAddress
Posted by Maarten Bosteels <mb...@gmail.com>.
Hi boB,
What you describe is the expected behaviour :-)
You're decoder is notified whenever new data arrives. Accumulating this
data (when necessary) is the responsibility of the decoder.
Usually the easiest thing to do is extending CumulativeProtocolDecoder.
http://mina.apache.org/report/trunk/apidocs/org/apache/mina/filter/codec/CumulativeProtocolDecoder.html
Also have a look at
http://mina.apache.org/tutorial-on-protocolcodecfilter-for-mina-2x.html
Maarten
On Mon, Dec 29, 2008 at 9:50 PM, boB Gage <bg...@ekosystems.com> wrote:
> I've got a Mina application going that communicates with a variety of
> devices through both serial and network interfaces.
>
> Part of this application is data-set simulations (ie fake far-end devices)
> handled by using VmPipeAddress and VmPipeConnector objects.
>
> My data simulator puts data into the stream via session.write() calls; my
> "normal" decoders pick up that data as if it had come from a real device.
>
> This set of objects works to an extent. BUT.... data that is sent via
> two consecutive session.write() calls does NOT show up as expected in the
> decoder.
>
> For example, assume a decoder that wants packets delimited by 0x01 (start)
> and 0xFF (end)
>
> session.write(0x01 02 03 04 05) followed by
> session.write(0x06 07 08 09 FF)
>
> Generates two calls to "decode" in the decoder object.
> The first with five bytes 0x01 02 03 04 and 05 returns NEED_DATA because
> the 0xFF end is not seen
> The second with 5 bytes 0x06 07 08 09 FF returns NOT_OK because there is no
> 0x01 start byte.
>
> I would have expected two calls, but different parameters:
> First with 0x01 02 03 04 05 which would return NEED_DATA. The second with
> 0x01 02 03 04 05 06 07 08 09 FF which would return OK (after parsing)
> because it had a full packet.
>
>
> Am I suffering from unrealistic expectations?? Is this a known Mina bug???
> Have I just done something stupid???
>
>
> Thanks in advance,
> boB
>
>