Camel 中的转换:如何进行

Camel 中的转换:如何进行

想要你的数据,你的方式?了解可以在 Apache Camel 中转换数据的所有不同方式。

你如何在 Apache Camel 中转换数据?

如果您刚刚开始使用 Apache Camel,似乎有一个令人眼花缭乱的选项选择。

处理器?其中的EIP一样的东西?消息翻译器?

在 Camel 中转换数据通常通过以下方式之一完成:

  • 使用 Java 代码和类型转换器进行映射

  • 使用专门的 Camel 组件,如 XSLT、Bindy 或 Atlasmap

  • 使用数据格式Marshalling/unmarshalling(编组/解组),如 CSV 和 JSON

  • 使用模板引擎,如Velocity、 Mustache 或 Freemarker

Camel 中的数据转换Camel 中的转换方法:编组、类型转换和模板!

那么你怎么知道选择哪一个呢?毕竟,他们似乎都在做同样的事情,不是吗?

让我们来看看它们中的每一个。

我不会在这里推荐一种方法而不是另一种方法。本文旨在为您提供选项的广泛概述,以便您可以深入研究 Camel 文档和示例并做出选择。

那么让我们来看看吧!

使用 Java 代码进行转换

也被称为……Java架构师的梦想

在这种方法中,您的输入和输出数据都需要是 Java 对象,并且您使用 Java 语句在它们之间进行映射。当您需要从类型转换为目标类型时,您可以编写一个方法来创建一个新的目标对象,并使用源对象中的相关字段填充它。然后,您告诉 Camel 调用该方法(例如 using bean,或者可能是Processor)。

例如,您可以将Lead对象转换为Customer. 所以你写了一个转换方法public static Customer convertToCustomer(Lead lead)

public static Customer toCustomer(Lead lead) {
    Customer customer = new Customer();
​
    customer.setName(lead.getName());
    customer.setCompany(lead.getCompany());
    customer.setCity(lead.getCity());
​
    return customer;
}

如果您的源数据作为基于文本的格式(如 🖹 XML 🖹)进入 Camel,那么首先您需要从基于文本的格式解组为 Java 对象,如POJO。

这种方法是正确的,全面的 Java。它通常需要编写大量 Java 代码。但是,它也是强类型的。在我看来,这是一件好事。Java 类型系统的伟大之处在于您获得了内置的“类型安全”——例如,您不能将String值放入专为Integer.

有一些工具可以使这个过程更容易一些。如果您正在使用 XML,那么您可以使用 Java 的JAXB(在Apache CXF 之类的工具中实现)从您的 XML 模式创建 Java 类,然后将该 XML 对象转换为 Java。

如果……那就更好了。你注册一个 TypeConverter

编写转换代码后,您可以从 Camel 调用它,就像任何其他常规 Java 方法一样

但是,你可以把它更多... Camelly ......通过注册它作为一个类型转换器。这增加了你的代码,以骆驼图书馆适配器,可以转换从Java对象TypeATypeB。当您编写自己的转换代码时,您可以将其注册为TypeConverter,以便 Camel 知道它如何从您LeadCustomer.

为此,您只需将@Converter注释添加到您的类中:

import org.apache.camel.Converter;
​
@Converter
public class CustomerConverter { ... }

您还将完整的类名添加到文件中resources/META-INF/services/org/apache/camel/TypeConverter

com.cleverbuilder.cameldemos.typeconverters.CustomerConverter

现在您可以.convertBodyTo(Customer.class)Camel routes 中使用,Camel 将执行类型转换器。

使用专门的 Camel 组件(端点)进行转换

也称为…… *将工作交给专家*

编写 Java 代码“很好”。尽管我不会称之为“令人愉快”,除非您真的很喜欢编写大量的样板代码。因此,您可能想知道是否有工具可以帮助您从一种格式转换为另一种格式——而无需自己编写所有这些样板代码。

这就是专业转换组件的用武之地。他们是一群工人,您可以召集他们来完成特定的工作。与一些工人不同的是,他们通常会准时出现,并且不会说“我不能为你做这件事,因为我不是合格的伙伴。但这次访问我仍然会向你收费。”

当您初始化这些组件之一时——无论是在代码中显式地,还是在像 Spring Boot 这样的框架中自动地初始化——您都会得到一个端点,您可以通过它来推送消息,作为路由的一部分。当消息通过 Endpoint 时,该组件启动,转换您的消息,并返回输出。

这使您的 Camel 路线看起来像这样:

from("file:somewhere...")
  .to("some-component:blah?someConfig=1&anotherConfig=true")
  .to("file.....")

如您所见,您的 Camel 代码看起来相当干净。现在您使用 Camel 作为协调器,将工作交给其他组件来完成。

那么,祈祷一下,这些🎠 神奇的组件🎠 是您可以使用的吗?Camel 中这些转换组件的一些很好的例子是:

成分它能做什么基于
XSLT 使用 XSLT 转换文件直接将 XML 转换为 XML。当你看到它时,你就会知道其中之一。  
XSLT Saxon 如果您想使用 Saxon 库,请使用此组件。为您提供一些更高级的转换和更好的性能。 XSLT Saxon
Dozer Dozer 用于 Java 到 Java 的映射。它用一个 XML 映射文件替换了上面所有的样板代码。(这是否是一件好事值得商榷:-)) Dozer
Atlasmap 这是街区的新来的孩子。它可以在 JSON、XML 和 Java 对象之间进行映射。就像 Dozer 一样,它使用映射文件。您可以使用Visual Studio CodeAtlasmap 扩展在开发环境中创建映射文件 Atlasmap

使用数据格式

也称为……*编组器和解组器。*

这是另一块拼图。Camel中的数据格式是用于处理Zip 文件、Avro、Base64 编码文件、HL7(医疗保健)文件、JSON、Protobuf等内容的实用程序层。

配置数据格式后,您可以将其插入编组解组步骤,如下所示:

// import org.apache.camel.dataformat.csv.CsvDataFormat;
// import org.apache.camel.model.dataformat.JsonDataFormat;
// Set up a CSV data format
CsvDataFormat csv = new CsvDataFormat();
​
// Set up a simple JSON output format
JsonDataFormat json = new JsonDataFormat(JsonLibrary.Jackson);
​
// Convert an incoming CSV into JSON
from("direct:start")
        .unmarshal(csv) // unmarshal from CSV
        .marshal(json) // marshal out to JSON
        .to("direct:end");

*Bindy*是一种可定制的数据格式,可以处理固定宽度(例如 FIX)和可变宽度(例如 CSV)文件。Bindy 是一个非常酷的库,可以帮助您摆脱困境,尤其是当您使用一些非常不寻常或旧的文件格式时。

有了 Bindy,只要你能建立文件格式的规则——比如第一列有多少个字符,分隔符是什么等等——你可以用 Camel 来处理。

查看正在运行的 Bindy 演示。

使用模板引擎

也被称为……*我需要为老板制作一份报告*

我将在本文中介绍的最后一个选项是模板引擎。如果您需要构建任何类型的人们可以看到的文本输出,这些都非常棒。

想想电子邮件、文档、网页之类的东西…… 就像邮件合并一样,模板引擎可以采用模板和一些源数据并生成文档。

如果您仍然不确定我的意思,那么我说的是对VelocityMustache 之 类的支持{👨。

在 Camel 中,模板引擎从您的Exchange读取值。因此它可以访问诸如消息正文和标题之类的内容。

Camel 有一些模板引擎的组件。我没有处理过所有这些,所以我不知道它们之间的区别,但是如果您需要特定的东西,请先查看每个文件的文档:

  • Chunk

  • Freemarker

  • Mustache

  • MVEL

  • Velocity

简而言之,这就是骆驼的转变

这是 Apache Camel 中转换的概述。您有很多不同的选择,具体取决于您需要 Camel 做什么。

 

posted @ 2021-09-26 17:06  yiwenzhang  阅读(1013)  评论(0编辑  收藏  举报