On Jun 13, 2006, at 1:50 PM, Nathan Mittler wrote:

Could you guys point me to a place in AMQ where this sort of thing is being
done?  That would save me a lot of searching =)

I'm viewing this problem from the client side - the Stomp C++ client that
Tim Bish and I are writing currently supports text and bytes messages.

Within a general Stomp client, I would suggest that switching on JMS message types is not a productive goal. Using Content-type here makes a lot more sense, I think. . It would make a lot of sense to set it for text messages going out to Stomp if there is not one already supplied.

Stomp is a protocol, like HTTP or SMTP -- hardwiring a client to a specific server implementation is probably not a general solution (though is fine if it is specifically an activemq client which happens to use stomp for transport).

So when I get a stomp frame in, I need to map it back to a text or bytes message. We chose to do this for a couple of reasons: 1) to give JMS users a familiar interface and 2) to provide a simple interface for reading and
writing text messages (e.g. xml).

Content-type: text/xml

--

Content-type: application/octet-stream

With that said, I'm not seeing how I can do that mapping if the transformer is provided only in the SUBSCRIBE. A client could potentially get a variety of message types from a single subscription. I think it would have to be
part of the MESSAGE frame, rather than the SUBSCRIBE.

SUBSCRIBE
activemq-transformer: com.example.ContentTypeMapper

Here are the use cases I see:

s/transformer/activemq-transformer/g

I like the namespace.

Client->Server
1) SEND\n...\ntransformer:text (client tells server it's a text message)

+1

2) SEND\n...\ntransformer:bytes (client tells server it's a bytes message)

+1

3) SEND\n...\ntransformer:default (client tells server to use content-length
to make determination)

-1 Give it a descriptive name so that we can change the default without breaking these.

4) SEND\n...\n (no transformer specified - same as #3)

+1

5) SEND\n..\ntransformer:bob (client gives server unknown transformer - use
default)

Return an error -- do not quietly swallow this.

Server->Client
1) MESSAGE\n...\ntransformer:text (server tells client it's a text message)

+1

2) MESSAGE\n...\ntransformer:bytes (server tells client it's a bytes
message)

+1

3) MESSAGE\n...\ntransformer:default (server tells client to use
content-length to make determination)

-1 same as #3 above

4) MESSAGE\n...\n (no transformer specified - same as #3)

+1

5) MESSAGE\n...\ntransformer:bob (server tells client to use unknown
transformer - use default)

-1 same as #5 above


This does highlight that we have two real transform cases, send and receive if we support CONNECT or SUBSCRIBE level transformers. We can infer the correct direct on MESSAGE and SEND, but not the others. As this would make the interface have all of two methods, I am quite happy combining it.

Alternately we can have different headers on SUBSCRIBE and CONNECT

-Brian

Reply via email to