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

Posted

技术标签:

【中文标题】在 Apache Camel 中的处理器之间传递值【英文标题】:Passing values between processors in apache camel 【发布时间】:2012-05-07 01:01:38 【问题描述】:

在 apache camel 中,哪一个是将值从交换处理器传递到另一个(以及为什么)的最佳方式:

将其存储在交换标头中 在构建路线时使用setProperty 方法。 另一种方式..

【问题讨论】:

【参考方案1】:

答案在这里:

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

【讨论】:

只是补充一点,在路由的整个生命周期中交换是相同的,但是消息可能会发生变化,例如,如果消息从一种格式转换为另一种格式(来自 Camel in Action )。【参考方案2】:

Ben 和 Petter 没有提到的一个区别是,在 Camel 中处理消息的整个过程中,属性都是安全存储的。相反,标头是消息协议的一部分,并且可能不会在路由期间传播。例如,JMS 对您可以存储为标题等的内容有限制。

您可能想阅读 Camel in Action 书籍的免费第 1 章,因为它涵盖了 Exchange、Message 等的 Camel 概念。

【讨论】:

+1 这是一个重要的区别。一般来说,如果你想确保你设置的数据最终会出现在你想要的地方,那么我强烈建议你使用这些属性。过去我一直为此感到困扰,有人在我传递存储在标头中的信息的路线中间添加了一个 JMS 步骤,而信息刚刚停止通过。 在 JMS 的情况下,根本不传播属性,并且标题是推荐的消磨时间的方式。这不正确还是我遗漏了什么? 也许是条款。 JMS body + properties 是JMS 术语。在 Camel 中,它的正文 + Message 上的标头,以及 Exchange 上的属性。 Camel 映射 body -> body 和 headers -> JMS 属性。 似乎 JMSProperties 不支持 Java 集合作为一种类型。如果您需要同一标题的多个值,则应考虑到这一点。我们发现的唯一方法是在发送到队列端点之前使用marshal().xstream() 序列化正文中的 Map。 安全吗?您的意思是设置仅在当前处理中看到的不同属性?【参考方案3】:

属性和标题几乎相同。但是,标头在某些组件(例如 Jms)上转换为/从特定于协议的标头转换。所以,

路由内的元数据:属性 进出外部的元数据:标头

【讨论】:

【参考方案4】:

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

使用 Exchange 属性获取有关消息的一般元数据(使用频率较低) 使用 IN 消息标头配置端点属性或有关消息正文的元数据(经常使用) 使用 IN 消息体作为消息的负载(最常用) 仅在必要时创建 OUT 消息,以便在处理期间维护单独的 IN 和 OUT 消息(默认情况下仅使用 IN)

也就是说,这实际上取决于在您的处理器之后调用的组件。大多数都有一些使用端点等所需的标头和/或正文值。有关这些详细信息,请参阅特定的component page。

此外,在这些页面上更详细地解释了交换/消息:

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

【讨论】:

以上是关于在 Apache Camel 中的处理器之间传递值的主要内容,如果未能解决你的问题,请参考以下文章

springboot 整合 apache camel实现企业级数据集成和处理

springboot 整合 apache camel实现企业级数据集成和处理

Apache Kafka 和 Camel 之间的区别(代理与集成)

如何在apache camel 2.23.1版本的处理器交换对象中获取RouteId?

Apache Camel中的OnCompletion用于整个文件的完成

Apache Camel中的窃听和多播有啥区别