JMSType is a reserved header in JMS, for use at the application level. I think what you are proposing is more accurately an ActiveMQ specific transform header. I think this type of transform should either be a real, arbitrary, pluggable, transform mechanism, or should not be done.

I would much prefer to *always* use a bytes message, but this is backwards incompatible so cannot be done in 4.X.

I would propose that instead of overloading JMSType, if we think we need to have a transform/mapping mechanism we base it on an active-mq specific header, and make it something like:

STOMPMessageTransformer {
public ActiveMQMessage transform (SomeRepresentationOfTheSendFrameIncludingHeaders frame) {
    ...
  }
}

I am not convinced we need this, but I much prefer it to a hardcoded transform, as this would allow for much more useful transforms (ie, aplication-aware).

I think that, properly, this should be done by a service on the messaging bus though, NOT in a protocol handler.

-Brian

On Jun 12, 2006, at 12:59 PM, Mittler, Nathan wrote:

I'm working on fixing the way the STOMP transport determines Text and
Bytes messages for issue AMQ-739.  Previously we keyed off of the
content-length header - if it was there, it's a bytes message, and
otherwise it's a text message.



Since all STOMP messages can have content-length, we need to use JMSType
to distinguish in these cases.  To do this, we need to define standard
JMSType values for Text and Bytes messages.  I have a build that uses
"text" and "bytes" as the standard values for the "type" header. On the
broker side, the logic in Send.java looks like this  ...



****** BEGIN CODE ******



// Assume the message is a bytes message.

Boolean isBytesMessage = true;



// If the message does not contain a content length,

// we have to assume it's a text message - first zero

// we encounter denotes the end of the frame.

If( !headers.containsKey(Stomp.Headers.CONTENT_LENGTH) ){

            isBytesMessage = false;

}

// There is a content length specified,

// now use JMSType to determine the message type (default to bytes if
none specified)

else if( headers.containsKey( Stomp.Headers.Send.TYPE ) ){

            isBytesMessage =
(headers.getProperty(Stomp.Headers.Send.TYPE) ==
Stomp.Headers.TypeValues.BYTES);

}



if( isBytesMessage ){

            // create a bytes message.

}else{

            // create a text message.

}



****** END CODE *******



Any objections?



Regards,

Nate






Reply via email to