简体   繁体   中英

How to get AMQP Message properties in Apache Camel AMQP Component

I have a Springboot application using Apache Camel AMQP component to comsume messages from a Solace Queue. To send a message to the Queue I use Postman and the Solace REST API. In order to differentiate the message type I add Content-Type to the header of the Http request in Postman. I used SDKPerf to check the message header consumed from solace and the message header is found under "HTTP Content Type" along with other headers.

However, I can't seem to find a way to get this Content-Type from Camel Side. In the documentation it says

String header = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);

However this always produces null. Any Ideas how to get the message properties in Camel?

It may have a different name in Camel. Try either printing all the headers or stop it in the debugger and examine the incoming message.

From what I can see, the Content-Type header used in SMF is not passed through to the consumed AMQP message; it is only used to set the type of message (eg TextMessage). Check "Content-Type Mapping to Solace Message Types" here: https://docs.solace.com/API/RESTMessagingPrtl/Solace-REST-Message-Encoding.htm#_Ref393979978

You can see this using SDKPerf AMQP to dump the received message (note this uses QPid libraries):

./sdkperf_jmsamqp.sh -cip=amqp://localhost:5672 -stl=a/b/c
 -md -q

curl http://localhost:9000/TOPIC/a/b/c -d 'hello' -H 'Content-Type: text'

^^^^^^^^^^^^^^^^^^ Start Message ^^^^^^^^^^^^^^^^^^^^^^^^^^^
JMSDeliveryMode:                        PERSISTENT
JMSDestination:                         a/b/c
JMSExpiration:                          0
JMSPriority:                            4
JMSTimestamp:                           0
JMSRedelivered:                         false
JMSCorrelationID:                       null
JMSMessageID:                           null
JMSReplyTo:                             null
JMSType:                                null
JMSProperties:                          {JMSXDeliveryCount:1;}
Object Type:                            TextMessage
Text:                                   len=5
  hello

So yeah, this header does not get mapped through (unlike a received SMF message)... it's just to set the message type. If I remove that HTTP header, the received AMQP message is binary.

Since other types of Content-Types also map to TextMessages (eg application/json , application/xml , etc.), the fact you're receiving a TextMessage is not enough to infer exactly what Content-Type you published your REST message with. So my suggestion is this: set an additional custom header, a User Property , which will get passed through to the AMQP message:

curl http://localhost:9000/TOPIC/a/b/c -d 'hello' -H 'Solace-User-Property-AaronEncoding: CustomText' -H 'Content-Type: text'


JMSProperties:                          {AaronEncoding:CustomText;JMSXDeliveryCount:1;}
Object Type:                            TextMessage
Text:                                   len=5
  hello

Hope that helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM