Apache Camel 数据格式与类型转换器

Apache Camel Data Format vs Type Converter

我通读了 Camel 书,但无法真正理解如何区分这两者,它们看起来一样,都试图将一种数据类型转换为另一种数据类型。任何人都可以进一步详细说明在哪种情况下我应该使用特定的一种而不是另一种?这两者有什么区别吗?

数据格式

http://camel.apache.org/data-format.html

伪例子:

from("file://riders/inbox")
.marshal().csv()
.to("activemq:queue:inbox");

类型转换器

http://camel.apache.org/type-converter.html

伪例子:

from("file://riders/inbox")
.convertBodyTo(String.class)
.to("activemq:queue:inbox");

Camel 以可插入的方式支持不同的数据格式。这意味着 Camel 可以编组或解组给定格式的消息。 Camel 原生支持 Avro、JSON、protobuf、JAXB、XmlBeans、XStream、JiBX、SOAP 等。

Camel 知道端点的预期格式和类型,因为这个 camel 寻找类型转换器,它可以将消息从一种类型转换为 another.You 甚至可以像 POJO 一样使用您自己的类型转换器 class.

在下面的示例中.convertBodyTO首先将流转换为字符串,我们还可以通过设置字符集参数来更改流的编码。

例子-

from("file://riders/inbox")
.convertBodyTo(String.class,"UTF-8")
.to("activemq:queue:inbox");

.marshal().csv() 将其编组为 csv 字符串格式

当您必须将消息转换为特定数据类型时,您可以使用 Dataformat JSON,YAML,JAXB,但您不能使用 DataFormat 将消息转换为用户定义的数据类型。

如果要将类型转换为任何其他类型,请使用类型转换器。例如,您可以使用类型转换器将猫 class 转换为狗 class。

Marshal / Unmarshal 来自 serializeable 学校。基本上,您可以将内存中的任何数据结构映射到字节流(例如,可能将其保存在磁盘中)。 Apache Camel 镜像相同(尽管他们已将其扩展为一些常用格式,如 XML、HL7 等)。这些也是字符串(大部分)或可以很容易地表示为可以很容易地序列化的字节流(例如 protobuf)的类型。

在 Apache Camel 中,如果您注意到,如果您使用 marshal/unmarshal,它不是通用的。输入或输出类型是固定的 - 意味着您不能从一种类型转换为任何类型。但类型转换器不是这种情况 - 您可以将类型转换为任何类型(使用默认类型转换器或您必须提供实现)。

您可以将 marshal/unmarshal 视为类型固定的类型转换的特定情况(通常只有 Camel 人员会提供实现)。正如您在示例中所见,marshal().csv() 是 Camel DSL 的一部分。

但是如果您使用类型转换器,您可以自由添加您自己的逻辑。那是通用的。