Apache Camel 中 setHeader 和 setProperty 的用途是什么?

Ger*_*rry 2 apache-camel

抱歉,我是骆驼新手。查看这两种方法的文档,没有任何有意义的指示表明您何时可能想要使用这些方法。

例如 setProperty() 参见https://camel.apache.org/components/3.19.x/eips/setProperty-eip.html

除了设置和删除它们之外,我没有看到任何属性方法。重点是什么?标题也是如此,您可以设置它们,但不知道如何获取它们。

Vij*_*mar 8

\n

抱歉,我是骆驼新手。查看这两种方法的文档,没有任何有意义的指示表明您何时可能想要使用这些方法。

\n
\n

要了解何时要使用这些方法,您需要了解HeadersProperties之间的区别。

\n

org.apache.camel.Message\xe2\x80\x94 包含 Camel 中携带和路由的数据的基本实体。

\n

消息是系统在使用消息传递通道时用来相互通信的实体。消息沿一个方向流动,从发送者到接收者。

\n

消息具有正文(有效负载)、标头和可选附件。

\n
    \n
  • 标头是与消息关联的值,例如发件人标识符、有关内容编码的提示、身份验证信息等。
  • \n
  • 标头是名称-值对;名称是唯一的、不区分大小写的字符串,值的类型为 java.lang.Object。
  • \n
  • Camel 对标头的类型没有任何限制。
  • \n
  • 消息中包含的标头大小或标头数量也没有限制。
  • \n
  • 标头作为映射存储在消息中。
  • \n
\n

消息还可以包含可选附件,这些附件通常用于 Web 服务和电子邮件组件。

\n

org.apache.camel.Exchange\xe2\x80\x94 Camel 中的交换是路由期间的消息\xe2\x80\x99s 容器。交换还为系统之间各种类型的交互提供支持,也称为消息交换模式 (MEP)。请在此处阅读有关欧洲议会议员的更多信息。

\n

Camel交换具有 ID、MEP、异常和属性。它还具有用于存储传入消息的输入消息和用于存储回复的输出消息。

\n
    \n
  • 属性与消息标头类似,但它们在整个交换期间持续有效。
  • \n
  • 属性用于包含全局级信息,而消息头特定于特定消息。
  • \n
  • Camel本身在路由过程中向交换添加了各种属性。
  • \n
  • 作为开发人员,您可以在交换生命周期内的任何时候存储和检索属性。
  • \n
\n

因此,有了这种理解 - 现在根据您的用例,您需要决定是否在标头或属性中保存您的“类型”(即您想要保存的值)。

\n
\n

除了设置和删除它们之外,我没有看到任何属性方法。重点是什么?标题也是如此,您可以设置它们,但不知道如何获取它们。

\n
\n

要检索标头或属性,请使用以下任一方法

\n
    \n
  1. 简单的表达语言
  2. \n
  3. 标题语言
  4. \n
  5. 交换语言
  6. \n
  7. 绑定语言
  8. \n
\n

也许还有更多的方法,但这些方法很多并且被广泛使用(至少对我来说是这样!)。

\n

更新:您可以使用 Simple 中的 ExchangeProperties 访问您设置的交换属性,下面是一些示例,

\n
from("seda:updateCustomer").routeId("update-customers-details")\n    .setProperty("customerId").simple("${header.customerId}")\n    .setProperty("requestBody").body()\n    .setProperty("someConstant").constant(123)\n    // You can access the properties with exchangeProperty method using simple language \n    .log(LoggingLevel.INFO, "Value of customerId from exchange: ${exchangeProperty.customerId}")\n    .log(LoggingLevel.INFO, "Request body saved in exchange: ${exchangeProperty.requestBody}")\n    .log(LoggingLevel.INFO, "Value of someConstant in exchange: ${exchangeProperty.someConstant}")\n    .log(LoggingLevel.INFO, "Value of exchangeId: ${exchangeId}")\n    .log(LoggingLevel.INFO, "Value of entire exchange: ${exchange}")\n    ..\n    ..\n
Run Code Online (Sandbox Code Playgroud)\n

资料来源:https ://livebook.manning.com/book/camel-in-action-second-edition/chapter-1/

\n

  • 不,您可以在路由中使用 [Simple](https://camel.apache.org/components/3.4.x/languages/simple-language.html) 通过 ExchangeProperty 访问保存在交换中的属性。我在答案中为您添加了一些示例。 (2认同)