apache camel 簡單使用 及第一個路由apache-timer元件
簡介
camel是一個非常強大的基於規則的路由以及媒介引擎
重要名詞
- Camel Context
camel的執行容器,管理所有的camel路由。類似於spring中的context。
- Route
路由,它定義了Message如何在一個系統中傳輸的真實路徑或者通道。路由引擎自身並不暴露給開發者,但是開發者可以自己定義路由,並且需要信任引擎可以完成複雜的傳輸工作。每個路由都有一個唯一的識別符號,用來記錄日誌、除錯、監控,以及啟動或者停止路由。
個人理解為一向個流程走的定義。我們可以定義了一個路由規則,讓一個流程按照我們定義的規則走下去,和走公司的報銷流程很像。
- Endpoint
Endpoint作為Camel系統中一個通道的端點,可以傳送或者接受訊息。在Camel中Endpoint使用URI來配置。在執行時Camel通過URI來查詢端點。端點的功能強大、全面而且又可維護。
個人理解為一個路由(流程)的每一個環節,這個endpoint會定義在該環節中做什麼操作
- Component
Component是一些Endpoints URI的集合。他們通過連線碼來連結(例如file:),而且作為一個endpoint的工廠。現在Camel中又超過80個Component,可擴充套件。
個人理解是對Endpoint的一個封裝,因為每一類Endpoint都需要一個uri作為入口。那麼就需要對這個Endpoint的producer和consumer進行封裝。
- Exchange :
一個訊息之間通訊的抽象的會話。主要包括:
ExchangeId(唯一標識)
MEP(一種模式,有InOnly、OutOnly等)
Exception(路由過程中的異常)
Properties(可以進行傳遞的屬性,是鍵值對)
Message(InMessage和OutMessage)。
- Message
Camel中一個基本的包含資料和路由的實體,Messages包含了
唯一的識別(Unique Identifier)–java.lang.String型別
頭資訊(Headers)–會提供一些內容的提示,頭資訊被組織成名值對的形式,string–>Object
內容(body)是一個Object型別的物件,這就意味著,你要確保接收器能夠理解訊息的內容。當訊息傳送器和接收器使用不同的內容格式的時候,你可以使用Camel的資料轉換機制將其轉換為一個特定的格式。在許多情況下預先定義型別可以被自動轉換。
錯誤標記(fault flag)使用來標記正常或者錯誤的標記,通常由一些標準類定義,例如(WSDL)
- Processor
是一個訊息接受者和訊息通訊的處理器。當然,Processor是Route的一個元素,可用來訊息格式轉換或者其他的一些變換。
個人理解就是對exchange做處理的一個環節,不過是將它單獨拿出來而已。
第一個元件 timer
1、引入maven依賴
camel 核心依賴,slf4j 用於列印log
<dependencies>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>2.18.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
2、使用timer元件建立一個路由,只實現簡單的列印功能
注意:這個元件僅僅能用作consumer,不能用作producer。簡單地說,就是隻能放在from()裡面,不能放在to()裡面。
uri格式:timer:name[?options]
timer引數詳解官網:http://camel.apache.org/timer.html
public class MyFisterRouter extends RouteBuilder{
private final static Logger LOGGER= LoggerFactory.getLogger(MyFisterRouter.class);
public void configure() throws Exception {
from("timer://timer1?period=1000").process(new Processor() {
public void process(Exchange exchange) throws Exception {
LOGGER.info("message:{}",exchange);
}
});
}
}
通過from方法呼叫timer元件(timer1是元件名稱,period=1000代表每一秒呼叫一次),去呼叫processor(處理器)
3、建立一個main方法啟動camel
public class Main {
public static void main(String[] args) throws Exception {
// 這是camel上下文物件,整個路由的驅動全靠它了。
ModelCamelContext camelContext = new DefaultCamelContext();
// 啟動route
camelContext.start();
// 將我們編排的一個完整訊息路由過程,加入到上下文中 Apache Camel支援動態載入/解除安裝編排的路由
camelContext.addRoutes(new MyFisterRouter());
// 通用沒有具體業務意義的程式碼,只是為了保證主執行緒不退出
System.in.read();
}
}
啟動 main函式檢視日誌
4、對router進行修改 將2步驟中的configure方法改造
public void configure() throws Exception {
from("timer://timer1?period=1000").
//加入資訊內容
setBody().simple("test messge ${header.firedTime}").process(new Processor() {
public void process(Exchange exchange) throws Exception {
Object body = exchange.getIn().getBody();
//輸出內容
LOGGER.info("message body:{}",body.toString());
Message out = exchange.getOut();
//對輸出的資訊進行處理
out.setBody("process message");
}
}).
//to 呼叫log元件輸出
to("log:out");
}
重新啟動檢視資訊輸出(注意 :如果未對out進行設定則輸出InMessage內容)
Camel Context 路由的容器,啟動容器,加入路由,路由就會生效