Apache Camel 中 setHeader 和 setProperty 的目的是什么?

What is the purpose of setHeader and setProperty in Apache Camel?

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

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

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

Headers (.setHeader) 通常在向需要或需要它们的其他 components/systems 发送消息时设置,例如 Message Brokers、JMS、Web 服务、HTTP、FTP 服务器等 大多数 Camel 组件默认转发所有交换 headers。假设您在 header 秒内有敏感数据,它将被传播!

交换属性 (.setProperty) 可用于保存交换生命周期中可能需要的数据,而无需担心将它们的值传播到其他系统。

例如,在 HTTP 请求中,您必须定义一个方法(GET、POST 等),可能是 header。所以,将它设置为 header 是有意义的!另一方面,从此调用中检索到的数据可能会“保存”在 属性 中,以便在路由步骤中轻松重用。

Sorry I'm new to Camel. Looking at the documentation of these two methods, there is no meaningful indication of when you might want to use these methods.

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

org.apache.camel.Message — 包含在 Camel 中传输和路由的数据的基本实体。

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

Messages 有一个 body(有效负载),headers,并且可选附件。

  • Headers 是与邮件关联的值,例如发件人标识符、有关内容编码的提示、身份验证信息等。
  • Headers是name-value对;名称是唯一的 case-insensitive 字符串,值是 java.lang.Object.
  • 类型
  • Camel 对 headers 的类型没有任何限制。
  • 对于 headers 的大小或包含在消息中的 headers 的数量也没有限制。
  • Headers 在消息中存储为地图。

邮件也可以有可选的附件,通常用于网络服务和电子邮件组件。

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

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

  • 属性类似于消息 headers,但它们在整个交换期间持续存在。
  • 属性用于包含 global-level 信息,而消息 headers 特定于特定消息。
  • Camel 本身在路由期间为交换添加了各种属性。
  • 作为开发人员,您可以在交易所生命周期内的任何时候存储和检索属性。

因此有了这种理解 - 现在根据您的用例,您需要决定是否将 'type'(即您要保存的值)保存在 Headers 或属性中。

I don't see any property methods other than setting them and removing them. What is the point? Same for headers, you can set them, but no idea how to get them.

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

  1. Simple expression language
  2. Header language
  3. Exchange language
  4. Bind language

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

更新:您可以使用 exchangeProperties 从 Simple 访问您设置的交换属性,下面是几个示例,

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

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