通過本教程學習 Apache Camel 的基礎知識並在 Spring Boot 項目上創建您的第一個 Camel。
想開始使用
我為完整的初學者編寫了這個 Apache Camel 教程。它向您介紹了 Camel 的核心概念,並向您展示了如何使用 Maven 構建和運行您的第一個 Camel 項目,該項目在 Spring Boot 上運行。
歡迎!
歡迎來到這個初學者的 Apache Camel 教程。Apache Camel 是一個非常流行的 Java 集成框架。
有多受歡迎?好吧,
那是巨大的!因此,不僅人們對 Camel 產生了濃厚的興趣,而且人們也渴望了解它的功能。
您來到這里是因為您想開始使用 Apache Camel 並了解基礎知識。
無論您的背景如何,本教程都將幫助您掌握 Apache Camel 的基礎知識,並讓您快速上手。
享受!
PS:如果你喜歡這個教程,請分享給你的朋友,它有助於傳播關於Camel的信息!🐪
你會學到什么
在本教程結束時,您將:
-
了解 Apache Camel 是什么,以及它可以做什么
-
使用 Maven 創建一個基本的 Apache Camel 項目
-
了解 Camel 如何與 Spring Boot 配合使用
-
查看如何使用日志記錄
-
運行您的應用程序並對其進行測試
本教程適合您:
-
你想學習Apache Camel
-
您想知道如何創建 Camel 項目
-
您剛剛開始使用
-
您
-
您是一名 Java 開發人員,並且希望通過一個強大的框架來提升您的技能
-
你是一名建築師,你想更多地了解 Camel 的含義
您應該有一點 Java 經驗,並且熟悉使用命令行。
Apache Camel 簡介
那么什么是 Apache Camel 以及它的用途是什么?
Apache Camel 是一個Java集成庫。它是一組 Java API,可幫助您在不同的計算機系統之間集成和處理數據。
換句話說,駱駝是像不同的應用程序之間的膠水。
Camel 帶有
您可以將 Apache Camel視為 Java的管道工具包。就像真正的管道一樣,Camel 從一個點獲取數據,並將其通過管道傳輸到另一個點。在此過程中,數據可以更改、轉換或通過其他管道發送。
您的管道工具包中包含一系列適用於各種不同應用程序和軟件系統的適配器。有了一系列可供您使用的工具,您就可以選擇如何建造管道了。
Camel 的創意從何而來?
Camel 受到
Camel 開發人員認為構建一個代表本書理想的 Java 框架是一個好主意。因此 Apache Camel 大量借鑒了本書。
Camel事實
希望您已經開始了解 Camel 是什么。以下是有關 Camel 的一些事實,可幫助您了解有關項目本身的更多信息:
-
它是用 Java 構建的——這可能看起來很明顯,但是一旦你理解了這一點,你就會發現你可以使用 Java 的全部功能
-
整個代碼是完全——
-
它不僅適用於 Web 服務——它還是一個通用的集成框架。這意味着您可以選擇使用 Camel 來構建與 Web 服務相關的內容,但您不必這樣做。
-
它帶有一個龐大的組件庫——如果你能想到一個你想要與之交互的系統,那么可能已經有人為它編寫了一個組件;您可以做任何事情,從
-
它已經成熟——Apache Camel 是一些商業集成產品的基礎,如
Camel 的常見用例
幾乎任何時候您需要將數據從A移動到B,您都可以使用 Camel。可以使用
-
從 FTP 服務器獲取發票並將其通過電子郵件發送到您的會計部門
-
從文件夾中提取文件並將其推送到 Google Drive
-
從
-
制作允許用戶從數據庫中檢索客戶詳細信息的 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: |
Direct | 一起 | direct: |
Salesforce | 用於將數據傳入和傳出 Salesforce | salesforce: |
可以看到,每個組件通常都可以讀寫:
-
配置為寫入內容的組件稱為生產者——例如,寫入磁盤上的文件,或寫入消息隊列。
-
配置為讀取某些內容的組件稱為使用者——例如,從磁盤讀取文件,或接收 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 庫,但可以使用兩種語言之一進行配置 - Java或XML。用駱駝的話說,這些被稱為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 對象,例如List、Map或String。正文不必是字符串,如 JSON 或 XML。
Camel不同體型的例子
當您開始使用這些不同類型的對象時,Camel的真正力量就變得顯而易見了。Camel 具有強大的內置支持,可以在常見對象類型之間進行轉換。
事實上,對於許多常見的文件類型,您甚至可能幾乎不需要編寫任何轉換代碼。(減少編寫樣板代碼的時間?聽起來不錯,不是嗎?)
隨着您對 Camel 的體驗越來越多,您將了解更多關於 Camel 的消息模型的知識!
你的第一個Camel項目
在教程的這一部分中,我將向您展示如何使用 Maven 創建一個新的 Apache Camel 項目,即使您以前從未使用過 Camel。到本節結束時,您將已經創建並運行第一個項目,並開始了解 Camel 的強大功能。
我們將使用Maven 原型來做到這一點。Maven 原型就像新 Java 項目的模板。Camel 在每個版本中都提供了很多。這使您可以輕松開始新項目。
對於本教程,您將需要:
-
-
-
…就是這樣!
Mac 用戶注意事項:如果您使用的是 Mac,我建議您使用
使用 Maven 創建 Camel 項目
-
從您的桌面,拖放到終端或命令提示符。
-
鍵入此命令(全部在一行上):
mvn archetype:generate -DarchetypeGroupId=org.apache.camel.archetypes -DarchetypeArtifactId=camel-archetype-spring-boot -DarchetypeVersion=3.4.0
-
然后在出現提示時回答問題:
-
定義屬性“groupId”的值:
com.example
-
定義屬性“artifactId”的值:
my-camel-app
-
定義屬性 'version' 1.0-SNAPSHOT 的值:(輸入 Enter)
-
定義屬性 'package' com.example 的值:(輸入 Enter)
-
最后,系統會提示您確認、輸入
Y
並按Enter。
-
-
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 中。這是一個
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");
這段代碼看起來很復雜,但它實際上只是生成消息並打印出來。
讓我們詳細看看路線的每個部分:
-
它使用計時器 (
timer:...
) 來啟動路線。Camel 的 Timer 組件可用於以特定時間間隔觸發路由。這里,間隔是timer.period
,這是文件中定義的屬性application.properties
:from("timer:hello?period=")
這展示了如何在 Camel 路由中使用 Spring Boot 屬性。
-
該
transform()
EIP指出,我們要改變消息的內容。在此示例中,我們使用bean()
方法,該方法調用 Java bean(Java 類)上的方法。-
Camel 在名為 bean 的注冊表中查找
myBean
。因為我們使用的是 Spring Boot,它會在 Spring 上下文中搜索 bean 並找到它,因為MySpringBean
該類是用@Component("myBean")
. -
Camel 調用該
saySomething
bean 上的方法。
.transform().method("myBean", "saySomething")
-
-
的
filter()
EIP告訴Camel過濾消息,基於一些表達。在這種情況下,我們使用 Camel 的簡單表達式語言來檢查消息正文是否包含“foo”。如果是這樣,我們將當前的交換轉儲到日志中。.filter(simple("${body} contains 'foo'")) .to("log:foo") .end()
-
最后,將消息體的內容寫入輸出流(即標准輸出或 STDOUT):
.to("stream:out")
現在讓我們運行路由,看看會發生什么。
運行 Camel 應用程序
讓我們運行應用程序。我們將使用 Maven 運行它。
從終端或命令提示符運行 Maven,spring-boot:run
目標是:
mvn clean spring-boot:run
這將編譯您的應用程序並使用
如果您想從 Eclipse 或 IntelliJ 內部運行此項目,只需為該項目創建一個新的 Maven運行配置,並將其配置為執行目標:spring-boot:run
.
當應用程序啟動時,您會看到日志如下所示:
來自我們的 Camel 應用程序的日志
上面的日志告訴我們 Apache Camel 已正確啟動。
然后,每隔幾秒鍾,您應該會在日志中看到文本Hello World。這是因為 Camel 每隔幾秒鍾就會觸發要執行的路由。
當路由執行時,消息體被轉換(設置為Hello world),然后寫入標准輸出流或控制台。
要結束應用程序,您只需按 Ctrl+C。
接下來是什么?
這是 Camel 的一個非常基本的演示,但您可以開始了解它的功能。使用組件和 EIP,您幾乎可以構建您能想到的任何類型的數據流。
現在查看我的其他文章來幫助您學習 Camel:
-
當您想使用 Camel 的REST DSL創建自己的 REST API 時,
-
-