Correction: the malformed message is the third message. Update: If msg3 is a well formed short (~100 bytes) message everything works fine. I think that the exception has something to do with the error.
Best regards On Wed, Jul 29, 2009 at 11:43 PM, pablo caballero<[email protected]> wrote: > Hi, I have a problem with one of my mina based applications. > > Source code where the problem manifests itself: > > import org.apache.commons.logging.Log; > import org.apache.commons.logging.LogFactory; > import org.apache.mina.core.buffer.IoBuffer; > import org.apache.mina.core.session.IoSession; > import org.apache.mina.filter.codec.CumulativeProtocolDecoder; > import org.apache.mina.filter.codec.ProtocolDecoderOutput; > import org.jpos.iso.ISOMsg; > import org.jpos.iso.ISOPackager; > > public class TandemProtocolDecoder extends CumulativeProtocolDecoder { > > private static final int MAX_MESSAGE_SIZE = 4196; > private Log logger = LogFactory.getLog(TandemProtocolDecoder.class); > > private ISOPackager isoPackager; > > public TandemProtocolDecoder(ISOPackager isoPackager) { > super(); > this.isoPackager = isoPackager; > } > > public ISOPackager getIsoPackager() { > return isoPackager; > } > > public void setIsoPackager(ISOPackager isoPackager) { > this.isoPackager = isoPackager; > } > > public TandemProtocolDecoder() { > super(); > } > > �...@override > protected boolean doDecode(IoSession session, IoBuffer in, > ProtocolDecoderOutput out) throws Exception { > > String s = new String( in.array() ); > logger.debug("Choclo:" + s ); > > if (in.prefixedDataAvailable(2, MAX_MESSAGE_SIZE)) { > > int length = in.getUnsignedShort(); > byte[] bytes = new byte[length]; > in.get(bytes); > > ISOMsg isoMsg = new ISOMsg(); > isoMsg.setPackager( isoPackager ); > > //TODO Si no puede realizar el unpack lanza > ISOException y entra > por exceptionCaught del conector > //Ver somo manejarlo > isoMsg.unpack( bytes ); > > out.write(isoMsg); > > return true; > } > else{ > return false; > } > } > > } > > Problem description: > > 1.- The application message (tcp payload) consist in two bytes > indicating the size of the data and the data itself. > 2.- I have a test application that sends five messages to the mina > application: > * Message 1 (700 bytes - well formed) > * Message 2 (100 bytes - purposely malformed ISO message) > * Message 3 (700 bytes - well formed) > * Message 4 (700 bytes - well formed) > * Message 5 (700 bytes - well formed) > 3.- An IoBuffer (size = 2048) is fullfilled with msg1, msg2, msg3 and > a chunk of msg4 > 4.- msg1 and msg2 are processed correctly (unpacked to a isomsg and > writed to the output) > 5.- The unpacking of msg3 throws and exception ( isoMsg.unpack( bytes > ) ) as expected. This exception is handled by the exceptionCaught in > the IoHandler > 6.- In the next call of the doDecode method the IoBuffer is filled > with rest of msg4 and msg5 (the beginning of the msg4 is lost). This > cause that 2 bytes of the msg4's data are considered > as the data size of the next message (in this case the data size, > wrongly deducted, is >>> MAX_MESSAGE_SIZE and the > prefixedDataAvailable method throws an BufferDataException exception) > > Can someone tell me if there is an error in my code, is this the > expected behaviour (some workaround?) or if it is a bug? > > Thank you very much in advance > > Sorry for my bad English > > Best regards >
