【问题标题】:How to get AMQP Message properties in Apache Camel AMQP Component如何在 Apache Camel AMQP 组件中获取 AMQP 消息属性
【发布时间】:2023-01-20 03:44:47
【问题描述】:

我有一个 Springboot 应用程序,它使用 Apache Camel AMQP 组件来处理来自 Solace 队列的消息。要向队列发送消息,我使用 Postman 和 Solace REST API。为了区分消息类型,我在 Postman 的 Http 请求的头部添加了 Content-Type。我使用 SDKPerf 检查从 solace 消耗的消息标头,消息标头与其他标头一起位于“HTTP 内容类型”下。

但是,我似乎无法找到从 Camel Side 获取此 Content-Type 的方法。在文档中说

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

然而,这总是产生空值。任何想法如何在骆驼中获取消息属性?

【问题讨论】:

  • 您是否检查过是否确实使用 SDKPerf 设置了标头,例如:HOST=tcp://host:port USER=user@messageVPN PASS=password CC=1 cd ../../pubSubTools/ ./sdkperf_c -cip=$ HOST -cu=$USER -cp=$PASS -stl="your/topic/address" -cc=$CC -asw=255 -md cd - -md 标志会将负载和标头转储到命令行输出
  • 是的,我按照您的建议使用 SDKPerf 检查并找到了标头集。 HTTP 内容类型具有标头值,但是如何在 apache Camel 中获取该标头值

标签: apache-camel queue amqp spring-amqp solace


【解决方案1】:

它在 Camel 中可能有不同的名称。尝试打印所有标头或在调试器中停止它并检查传入消息。

【讨论】:

    【解决方案2】:

    据我所见,SMF 中使用的 Content-Type 标头没有传递到使用的 AMQP 消息;它仅用于设置消息的类型(例如 TextMessage)。在此处检查“Content-Type Mapping to Solace Message Types”:https://docs.solace.com/API/RESTMessagingPrtl/Solace-REST-Message-Encoding.htm#_Ref393979978

    您可以使用 SDKPerf AMQP 转储接收到的消息(注意这使用了 QPid 库):

    ./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
    

    所以是的,这个标头没有被映射(不像收到的 SMF 消息)......它只是设置消息类型。如果我删除该 HTTP 标头,则接收到的 AMQP 消息是二进制的。

    由于其他类型的 Content-Types 也映射到 TextMessages(例如 application/jsonapplication/xml 等),您收到 TextMessage 的事实不足以推断出您发布 REST 消息时使用的 Content-Type。所以我的建议是:设置一个额外的自定义标头,一个用户属性,它将传递给 AMQP 消息:

    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
    

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 2011-03-09
      • 1970-01-01
      相关资源
      最近更新 更多