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