Apache Camel 教程

通过本教程学习 Apache Camel 的基础知识并在 Spring Boot 项目上创建您的第一个 Camel。

想开始使用Apache Camel吗?这是我关于这个流行的 Java 集成框架的教程。

我为完整的初学者编写了这个 Apache Camel 教程。它向您介绍了 Camel 的核心概念,并向您展示了如何使用 Maven 构建和运行您的第一个 Camel 项目,该项目在 Spring Boot 上运行。

欢迎!

欢迎来到这个初学者的 Apache Camel 教程。Apache Camel 是一个非常流行的 Java 集成框架。

有多受欢迎?好吧,Stack Overflow 上的这个问题,Apache Camel 究竟是什么,已经被查看了超过一百万次。

那是巨大的!因此,不仅人们对 Camel 产生了浓厚的兴趣,而且人们也渴望了解它的功能。

您来到这里是因为您想开始使用 Apache Camel 并了解基础知识。

无论您的背景如何,本教程都将帮助您掌握 Apache Camel 的基础知识,并让您快速上手。

享受!

PS:如果你喜欢这个教程,请分享给你的朋友,它有助于传播关于Camel的信息!🐪

你会学到什么

在本教程结束时,您将

  • 了解 Apache Camel 是什么,以及它可以做什么

  • 使用 Maven 创建一个基本的 Apache Camel 项目

  • 了解 Camel 如何与 Spring Boot 配合使用

  • 查看如何使用日志记录

  • 运行您的应用程序并对其进行测试

本教程适合您

  • 你想学习Apache Camel

  • 您想知道如何创建 Camel 项目

  • 您刚刚开始使用Red Hat Fuse并想知道如何构建 Camel 路由

  • 刚开始使用 Talend ESB并想了解基本概念,以便了解中介路由。

  • 您是一名 Java 开发人员,并且希望通过一个强大的框架来提升您的技能

  • 你是一名建筑师,你想更多地了解 Camel 的含义

您应该有一点 Java 经验,并且熟悉使用命令行。

Apache Camel 简介

那么什么是 Apache Camel 以及它的用途是什么?

Apache Camel 是一个Java集成库。它是一组 Java API,可帮助您在不同的计算机系统之间集成和处理数据。

换句话说,骆驼是像不同的应用程序之间的胶水

Camel 带有200 多个组件,可让您集成许多不同的应用程序。Camel 可以集成从 Web 服务到在磁盘上读写文件的任何内容。您甚至可以将 Camel 与 Twitter、Facebook 和 Salesforce 等网络应用程序连接起来。

您可以将 Apache Camel视为 Java管道工具包。就像真正的管道一样,Camel 从一个点获取数据,并将其通过管道传输到另一个点。在此过程中,数据可以更改、转换或通过其他管道发送。

您的管道工具包中包含一系列适用于各种不同应用程序和软件系统的适配器。有了一系列可供您使用的工具,您就可以选择如何建造管道了。

Camel 的创意从何而来?

Camel 受到Enterprise Integration Patterns一书的启发,这是一本关于集成软件系统的学术教科书。这本书的作者(现在被认为是“经典”!)采用了许多常见的集成用例,将它们提炼成可重用的模式并记录下来。书中描述了每种模式,在某些情况下,还有一些示例代码。

Camel 开发人员认为构建一个代表本书理想的 Java 框架是一个好主意。因此 Apache Camel 大量借鉴了本书。

Camel事实

希望您已经开始了解 Camel 是什么。以下是有关 Camel 的一些事实,可帮助您了解有关项目本身的更多信息:

  • 它是用 Java 构建的——这可能看起来很明显,但是一旦你理解了这一点,你就会发现你可以使用 Java 的全部功能

  • 整个代码是完全开源的——在 Github 上查看——没有什么隐藏在昂贵的闭源产品后面。您可以为项目做出贡献并回馈社区。(您不必成为编码员即可做出贡献

  • 不仅适用于 Web 服务——它还是一个通用的集成框架。这意味着您可以选择使用 Camel 来构建与 Web 服务相关的内容,但您不必这样做。

  • 它带有一个庞大的组件库——如果你能想到一个你想要与之交互的系统,那么可能已经有人为它编写了一个组件;您可以做任何事情,从推送文件到 AWS到发送推文。

  • 它已经成熟——Apache Camel 是一些商业集成产品的基础,如Red Hat FuseTalend ESB。在这些公司工作的工程师将代码贡献回开源 Camel 项目,以使其对每个人都更好

Camel 的常见用例

几乎任何时候您需要将数据从A移动到B,您都可以使用 Camel。可以使用Camel实现以下任何场景:

  • 从 FTP 服务器获取发票并将其通过电子邮件发送到您的会计部门

  • 从文件夹中提取文件并将其推送到 Google Drive

  • ActiveMQ 队列中获取消息并将它们发送到 Web 服务

  • 制作允许用户从数据库中检索客户详细信息的 Web 服务

这些只是几个例子。有了 Camel 中可用的各种组件,天空就是极限。

Camel概念解释

你如何像骆驼一样思考?下图显示了 Camel 中的一些核心概念。

可视化骆驼路线

在本节中,我将依次查看每一个:

Route

在骆驼最基本的概念是route。路由是您在 Camel 中配置的对象,它将您的数据从A移动到 B

使用前面的管道示例,Route是将数据从一个地方移动到另一个地方的管道。它在称为Endpoints事物之间移动数据。

您可以使用 Java 语法或 XML 语法在 Camel 中创建路由。这是一个用 Java 语法编写的非常简单的路由。这会将文件从一个文件夹移动到另一个文件夹:

// 这是一个完整的 Camel 路由定义!``// Camel 将文件从一个文件夹移动到另一个文件夹``from(``"file:home/customers/new"``)``  ``.to(``"file:home/customers/old"``); 

Endpoints

在 Camel 中,endpoint是一个接口,Camel 通过它与另一个系统交换消息。Camel 可以从端点接收消息,也可以向端点发送消息。

端点是路线中沿途的步骤。您可以通过几种不同的方式声明它们,但最常见的方法是使用类似于 URI 的语法来声明它们,如下所示:

prefix:mainpart?option1=xxx&option2=xxx...

prefix端点引用的组件在哪里,是mainpart端点需要的一些配置。

例如:在路由的开始处,Camel 收到来自端点的消息。如果此端点为file:/myfolder,则 Camel 将使用 File 组件读取/myfolder.

Components

为了让 Camel 创建端点,它附带了一个组件库。组件就像一个插件,允许您连接到外部系统,例如磁盘上的文件、邮箱或 Dropbox 或 Twitter 等应用程序。

您可以将组件视为创建端点的工厂。

每当您需要将数据放入或取出应用程序时,您可能会发现已经存在一个 Camel 组件来为您完成这项工作。这意味着您无需浪费时间编写自己的代码来读取文件或调用 Web 服务。您只需找到您需要的组件并使用它。

Camel 组件是可重用的、开源的,您甚至可以贡献自己的组件。以下是一些最常见的组件,以及如何在端点中引用它们:

Component目的端点 URI
HTTP用于创建或使用网站http:
File用于读取和写入文件file:
JMS用于读取和写入JMS 消息队列jms:
Direct一起加入你的骆驼路线

direct是基于内存的同步消息组件

使用Direct组件,生产者直接调用消费者。因此使用Direct组件的唯一开销是方法调用

direct:
Salesforce用于将数据传入和传出 Salesforcesalesforce:

您可以在此处找到所有 Camel 组件的列表

可以看到,每个组件通常都可以读写:

  • 配置为写入内容的组件称为生产者——例如,写入磁盘上的文件,或写入消息队列。

  • 配置为读取某些内容的组件称为使用者——例如,从磁盘读取文件,或接收 REST 请求。

在每个端点之间,还可以通过将数据传递到另一个端点或使用 EIP 来转换或修改数据。

企业集成模式 (EIP)

EIP是 Camel 的另一个重要组成部分。它们根据我之前提到的《企业集成模式》一书中定义的模式对消息进行特殊处理。

当您想对消息执行一些常见活动时,例如转换、拆分和日志记录,您将使用 EIP。以下是 Camel 中一些常见的 EIP:

EIP名称它能做什么Java语法
Splitter将消息拆分为多个部分.split()
Aggregator将多条消息合并为一条消息.aggregate()
Log写一条简单的日志消息.log()
Marshal将对象转换为文本或二进制格式.marshal()
From*从端点接收消息.from()
To*向端点发送消息.to()

(是的,from 和 to 也是 EIP!)

Camel Context

最后,为了运行和管理你的路由,Camel 有一个名为 Camel Context 的容器。您的路线在此引擎内运行。你几乎可以把它想象成一个迷你应用服务器。

当 Camel启动时,它会读取您的路由定义(在 Java 或 XML 中),创建路由,将它们添加到 Camel 上下文,并启动 Camel 上下文。

当 Camel终止时,它会关闭您的路由,并关闭 Camel 上下文。

Route是什么样的?

所以。现在您知道,当您在 Camel 中进行开发时,您会使用组件创建在端点之间移动数据的路由

通过查看一些代码可能最容易理解所有这些,对吗?

尽管 Camel 是 Java 库,但可以使用两种语言之一进行配置 - JavaXML。用骆驼的话说,这些被称为DSL(领域特定语言)。

每条路线开始于from,具有URI,它定义了数据来自哪里。

一条路线可以由多个步骤组成——例如转换数据或记录数据。但路由通常结束于to步骤,其描述数据将被传递to哪里。

Camel 的 Java DSL 中一个非常简单的路由可能如下所示:

from("file:home/customers/new")
    .to("file:home/customers/old");

在此示例中,我们使用File 组件(由file:前缀标识)将文件customers/new夹中的所有传入文件移动到该customers/old文件夹。

上面的相同路径可以用 Camel 的 XML DSL 表示,如下所示:

<``route``>``  ``<``from` `uri="file:home/customers/new"/>``  ``<``to` `uri="file:home/customers/old"/>``</``route``>

但是......如果我们想在我们的路线中添加另一个步骤怎么办?假设我们想在收到文件时记录一条消息。然后我们只需要在现有步骤之间添加我们的新步骤。像这样:

from("file:home/customers/new")
    .log("Received a new customer!")
    .to("file:home/customers/old");

在上面的代码中,一条消息从新文件夹移动到旧文件夹。在中间,我们使用名为 的企业集成模式 (EIP) log,它将简单的日志消息写入控制台。

在 XML DSL 中,它看起来像这样:

<route>
    <from uri="file:home/customers/new"/>
    <log message="Received a new customer!"/>
    <to uri="file:home/customers/old"/>
</route>

现在您知道路由的样子了,让我们快速看看数据如何流经路由。

Camel中的数据是什么样的?

骆驼的消息模型

Camel 将数据视为单独的消息——就像通过邮局对信件进行分类一样。

每条消息都是一个单独的对象。一条消息可以很大,也可以很小。Camel 有一个对象来表示消息,它被称为Message.

AMessage有一个body,其中包含消息内容。它还具有标头,可用于保存与消息关联的值。该Message对象然后沿Route传递。

AMessage是另一个名为 Exchange 的 Camel 对象的一部分。您会经常看到Camel 文档中提到的术语Exchange。Exchange 只是当前在 Camel 路由中发生的消息或交互。

了解 Camel 消息模型的重要一点是消息体可以包含几乎任何类型的 Java 对象,例如ListMapString。正文不必是字符串,如 JSON 或 XML。

Camel不同体型的例子

当您开始使用这些不同类型的对象时,Camel的真正力量就变得显而易见了。Camel 具有强大的内置支持,可以在常见对象类型之间进行转换。

事实上,对于许多常见的文件类型,您甚至可能几乎不需要编写任何转换代码。(减少编写样板代码的时间?听起来不错,不是吗?)

随着您对 Camel 的体验越来越多,您将了解更多关于 Camel 的消息模型的知识!

你的第一个Camel项目

在教程的这一部分中,我将向您展示如何使用 Maven 创建一个新的 Apache Camel 项目,即使您以前从未使用过 Camel。到本节结束时,您将已经创建并运行第一个项目,并开始了解 Camel 的强大功能。

我们将使用Maven 原型来做到这一点。Maven 原型就像新 Java 项目的模板。Camel 在每个版本中都提供了很多。这使您可以轻松开始新项目。

对于本教程,您将需要:

Mac 用户注意事项:如果您使用的是 Mac,我建议您使用Homebrew包管理器来帮助您安装 Maven。按照http://brew.sh上的说明进行安装。然后,安装 Homebrew 后,通过brew install maven从终端窗口键入来安装 Maven 。

使用 Maven 创建 Camel 项目

  1. 从您的桌面,拖放到终端或命令提示符。

  2. 键入此命令(全部在一行上):

     mvn archetype:generate
     -DarchetypeGroupId=org.apache.camel.archetypes
     -DarchetypeArtifactId=camel-archetype-spring-boot
     -DarchetypeVersion=3.4.0
  3. 然后在出现提示时回答问题:

    • 定义属性“groupId”的值: com.example

    • 定义属性“artifactId”的值: my-camel-app

    • 定义属性 'version' 1.0-SNAPSHOT 的值:(输入 Enter)

    • 定义属性 'package' com.example 的值:(输入 Enter)

    • 最后,系统会提示您确认、输入Y并按Enter

  4. Maven 现在将创建您的新 Camel 项目。完成后,您会在新目录中找到它my-camel-app

看项目内部

camel-archetype-spring-boot原型(v3.4.0)创建的Camel 项目将具有如下所示的文件夹结构:

my-camel-app
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           ├── MySpringBean.java
    │   │           ├── MySpringBootApplication.java
    │   │           └── MySpringBootRouter.java
    │   └── resources
    │       ├── application.properties
    │       └── META-INF
    │           ├── LICENSE.txt
    │           └── NOTICE.txt
    └── test
        ├── java
        │   └── com
        │       └── example
        └── resources

RouteBuilder 类

有趣的代码在MySpringBootRouter.java 中。这是一个RouteBuilderclass,这是您定义 Camel 路线的地方。Maven 原型包括一个示例路线,以帮助您入门:

package com.example;

import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;

@Component
public class MySpringBootRouter extends RouteBuilder {

    @Override
    public void configure() {
        from("timer:hello?period=").routeId("hello")
            .transform().method("myBean", "saySomething")
            .filter(simple("${body} contains 'foo'"))
                .to("log:foo")
            .end()
            .to("stream:out");
    }

}

在这里,您将路由定义添加到configure()描述您希望 Camel 创建的每条路由的方法中。

如果您查看代码,您会看到MyRouteBuilder该类已经在其中定义了一个路由。

我们将很快查看路线。

utility类

Camel 路线取决于另一个类。在 Camel 路由中,使用 identifier引用bean(Java 对象)"myBean"。这实际上是通过在 Spring 上下文中查找具有 ID 的任何 bean 来解决的myBean。这意味着它实际上意味着这个类,MySpringBean

@Component("myBean")
public class MySpringBean {

    @Value("${greeting}")
    private String say;

    public String saySomething() {
        return say;
    }

}

包含此实用程序类是为了向您展示如何从 Camel 路由调用 Java 代码。该类有一个saySomething()Camel 路由调用的方法。我们很快就会看到这一点。

bootstrap 类

为方便起见,该项目还包含另一个 Java 类 ,MySpringBootApplication用于引导和运行应用程序。这是一个标准的 Spring Boot 主类:

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MySpringBootApplication {

    /**
     * A main method to start this application.
     */
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }

}

现在让我们看一下代码,看看这个项目做了什么。

项目是做什么的?

演示项目使用以下代码定义路由。代码以特殊的 Camel 语法或DSL(域特定语言)给出:

from("timer:hello?period=").routeId("hello")
    .transform().method("myBean", "saySomething")
    .filter(simple("${body} contains 'foo'"))
        .to("log:foo")
    .end()
    .to("stream:out");

这段代码看起来很复杂,但它实际上只是生成消息并打印出来。

让我们详细看看路线的每个部分:

  1. 它使用计时器 ( timer:...) 来启动路线。Camel 的 Timer 组件可用于以特定时间间隔触发路由。这里,间隔是timer.period,这是文件中定义的属性application.properties

     from("timer:hello?period=")

    这展示了如何在 Camel 路由中使用 Spring Boot 属性。

  2. transform()EIP指出,我们要改变消息的内容。在此示例中,我们使用bean()方法,该方法调用 Java bean(Java 类)上的方法。

    • Camel 在名为 bean 的注册表中查找 myBean。因为我们使用的是 Spring Boot,它会在 Spring 上下文中搜索 bean 并找到它,因为MySpringBean该类是用@Component("myBean").

    • Camel 调用该saySomethingbean 上的方法。

     .transform().method("myBean", "saySomething")
  3. filter()EIP告诉Camel过滤消息,基于一些表达。在这种情况下,我们使用 Camel 的简单表达式语言来检查消息正文是否包含“foo”。如果是这样,我们将当前的交换转储到日志中。

     .filter(simple("${body} contains 'foo'"))
     .to("log:foo")
     .end()
  4. 最后,将消息体的内容写入输出流(即标准输出或 STDOUT):

     .to("stream:out")

现在让我们运行路由,看看会发生什么。

运行 Camel 应用程序

让我们运行应用程序。我们将使用 Maven 运行它。

从终端或命令提示符运行 Maven,spring-boot:run目标是:

mvn clean spring-boot:run

这将编译您的应用程序并使用Spring Boot Maven 插件来运行您的应用程序。

如果您想从 Eclipse 或 IntelliJ 内部运行此项目,只需为该项目创建一个新的 Maven运行配置,并将其配置为执行目标:spring-boot:run.

当应用程序启动时,您会看到日志如下所示:

来自我们的 Camel 应用程序的日志

上面的日志告诉我们 Apache Camel 已正确启动。

然后,每隔几秒钟,您应该会在日志中看到文本Hello World。这是因为 Camel 每隔几秒钟就会触发要执行的路由。

当路由执行时,消息体被转换(设置为Hello world),然后写入标准输出流或控制台。

要结束应用程序,您只需按 Ctrl+C。

接下来是什么?

这是 Camel 的一个非常基本的演示,但您可以开始了解它的功能。使用组件和 EIP,您几乎可以构建您能想到的任何类型的数据流。

现在查看我的其他文章来帮助您学习 Camel:

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐