1. 程式人生 > >apache camel 簡單使用 及第一個路由apache-timer元件

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  路由的容器,啟動容器,加入路由,路由就會生效