在Apache Camel中传递处理器之间的数值。

33
在 Apache Camel 中,从一个 Exchange 处理器传递值到另一个处理器的最佳方式是什么(以及为什么):
  • 将其存储在 Exchange 头信息中
  • 在构建路由时使用 setProperty 方法
  • 其他方式...
4个回答

65

本文中未提到的一个区别是,在Camel中,属性将安全地存储在整个消息处理过程中,而标头则是消息协议的一部分,可能在路由期间不会被传播。例如,JMS存在对头文件存储内容的限制。

您可能希望阅读《Camel实战》书籍的免费第1章,因为它涵盖了Exchange、Message等Camel概念。


14
这是一个重要的区别。一般来说,如果你想确保所设置的数据最终到达目标位置,我强烈建议使用属性。我过去也曾因此遭受过挫折,当时有人在我传递存储在头部的信息的路线中添加了一个JMS步骤,结果信息就无法通过。 - Dawood ibn Kareem
在JMS的情况下,属性根本不会传播,而头部是传递数据的推荐方式。这是正确的吗?还是我漏掉了什么? - Bilgin Ibryam
2
也许是术语的问题。JMS body + properties 是 JMS 的术语。在 Camel 中,它是 Message 上的 body + headers 和 Exchange 上的 properties。Camel 将 body 映射到 body,将 headers 映射到 JMS 属性。 - Claus Ibsen
似乎JMSProperties不支持Java集合作为类型。如果您需要相同标头的多个值,则应考虑此问题。我们发现的唯一方法是在发送到队列端点之前使用marshal().xstream()将Map序列化到主体中。 - рüффп
安全?你的意思是设置不同的属性,只在当前处理中可见吗? - Chao

33

属性和头部基本上相同。但是,特定组件(如Jms)会将标头转换为特定协议的标头。因此,

  • 路由内的元数据:属性
  • 与外部交互的元数据:头部

24

Exchange 在处理器之间传递,它包含属性、IN 消息和可选的 OUT 消息。其中每个都能存储对象数据,但通常来说:

  • 使用 Exchange 属性存储消息的一般元数据(较少使用)
  • 使用 IN 消息头配置端点属性或存储消息正文的元数据(经常使用)
  • 使用 IN 消息正文作为消息的有效载荷(最常使用)
  • 只有在需要保留 IN 和 OUT 消息的情况下才创建 OUT 消息(默认仅使用 IN)

尽管如此,实际上还取决于接下来被调用的组件。大多数组件都具有一些必须使用端点所需的标题和/或正文值等。有关这些详细信息,请参见特定的组件页面

此外,Exchange/Message 的更多详细信息可以在以下页面找到:

http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Exchange.html

http://fusesource.com/docs/router/2.8/prog_guide/MsgFormats-Exchanges.html


9

答案如下:

属性:属性是一个Map,看起来像消息头。 主要区别在于它们的生命周期:属性存在于整个交换执行期间,而标头仅限于消息持续时间(并且消息在路由期间可能会发生很多变化,因此在交换执行期间)。 Camel本身可能会为某些用例添加一些属性。


1
只是补充一下,交换机在整个路由生命周期中都是相同的,但是消息可能会更改,例如,如果消息从一种格式转换为另一种格式(来自《Camel实战》)。 - Manu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接