1. 程式人生 > >Camel框架的快速認識和使用

Camel框架的快速認識和使用

Camel流程框架是Apache下的一個開源專案,是較為成熟的流程框架。在web專案中也可以無縫地集成於Spring當中。

一、簡單使用

引入camel相關的jar包:camel-core-2.10.4.jar。

1、經典的入門示例——檔案移動

public class FileMoveWithCamel {
	public static void main(String[] args) {
		try{
			CamelContext camelCtx = new DefaultCamelContext();
			camelCtx.addRoutes(new RouteBuilder() {
				
				//此示例中,只能轉移檔案,而無法轉移目錄
				@Override
				public void configure() throws Exception {
					from("file:f:/tmp/inbox?delay=30000").to("file:f:/tmp/outbox");
				}
				
			});
			
			camelCtx.start();
			boolean loop = true;
			while(loop) {
				Thread.sleep(25000);
			}
			System.out.println("迴圈完畢");
			camelCtx.stop();
		} catch(Exception ex) {
			ex.printStackTrace();
		}
	}

 其中file:類似於http://,是camel的協議元件。camel支援的元件還包括:bean browse dataset direct file log mock properties seda test timer stub validator vm xlst等。其中常用的有bean和direct以及file

執行上述程式,會發現file:f:/tmp/inbox下的檔案被轉移到file:f:/tmp/outbox了,並且在file:f:/tmp/inbox會生成一個.camel資料夾存放剛才被轉移的檔案。

2、入門示例二——帶Processor處理

先定義一個處理器,實現org.apache.camel.Processor介面

public class FileConvertProcessor implements Processor {

	@Override
	public void process(Exchange exchange) throws Exception {
//		Object obj = exchange.getIn().getBody(); //如果是getBody()則返回一個Object
		//如果是getBody(Class<T>)則返回T型別的例項
		InputStream body = exchange.getIn().getBody(InputStream.class);
//		System.out.println("進入:" + body);
		BufferedReader br = new BufferedReader(new InputStreamReader(body, "UTF-8"));
		
		StringBuilder sb = new StringBuilder("");
		String str;
		while((str = br.readLine()) != null) {
			System.out.println(str);
			sb.append(str + " ");
		}
		exchange.getOut().setHeader(Exchange.FILE_NAME, "converted.txt");
		
		exchange.getOut().setBody(sb.toString());
		System.out.println("body:" + exchange.getOut().getBody());
		
	}

加上處理器後處理檔案的程式

public class FileProcessWithCamel {
	public static void main(String[] args) {
		try{
			CamelContext camelCtx = new DefaultCamelContext();
			camelCtx.addRoutes(new RouteBuilder() {
				
				@Override
				public void configure() throws Exception {
					FileConvertProcessor processor = new FileConvertProcessor();
					//noop表示等待、無操作
					from("file:f:/tmp/inbox?noop=true").process(processor).to("file:f:/tmp/outbox");
				}
			});
			
			camelCtx.start();
			boolean loop = true;
//死迴圈表示掛起camel上下文,以便持續監聽
			while(loop) {
				Thread.sleep(25000);
			}
			camelCtx.stop();
		} catch(Exception ex) {
			ex.printStackTrace();}
	}
}

 執行程式後將用一行列印file:f:/tmp/inbox下的檔案的多行內容,並在file:f:/tmp/outbox下生成名為converted.txt的檔案。該檔案的內容即為file:f:/tmp/inbox下的檔案的多行內容顯示成的一行。

這裡要特別注意getIn(setIn),getOut(setOut)怎麼用:先看下面一張圖



 這張圖表明瞭:假設有流程A->B->C->D->……則A在處理完畢之後給B的話,A必須setOut結果,然後B要取流程中的“上一個”節點(即A)的結果則必須getIn取結果再處理,以此類推……A不能setIn結果,否則B getIn的話會取不到A set的結果。

二、整合在Spring當中

 需引入camel-core-2.10.4.jar camel-spring-2.10.4.jar

對已第一部分的第一示例,若在Spring中配置,並設定它隨著web專案的啟動而啟動,則可以這樣寫:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:drools="http://drools.org/schema/drools-spring"
	xmlns:camel="http://camel.apache.org/schema/spring"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://drools.org/schema/drools-spring http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-container/drools-spring/src/main/resources/org/drools/container/spring/drools-spring-1.0.0.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
	
	<bean id="fileConverter" class="com.xxxx.FileConvertProcessor" />
	
	<camelContext id="camel" autoStartup="true" xmlns="http://camel.apache.org/schema/spring">	 
        <route>  
            <from uri="file:f:/tmp/inbox?delay=30000"/>  
            <process ref="fileConverter"/>  
            <to uri="file:f:/tmp/outbox"/> 
        </route> 
	</camelContext>
</beans>

除此之外,其實更為常見的是一個處理流程往往需要經過很多個bean類。而檢視camel direct元件的用法:

In the route below we use the direct component to link the two routes together:

可知bean與bean之間的流程連線用的是direct,這裡不妨用fileConverter和fileConverter2兩個Processor測試(它們的具體定義省略,都得實現Processor介面),於是

        <bean id="fileConverter" class="com.xxx.FileConvertProcessor" />
	<bean id="fileConverter2" class="com.xxx.FileConvertProcessor2" />
	
	<camelContext id="camel" autoStartup="true" xmlns="http://camel.apache.org/schema/spring">
		 <template id="producerTemplate" />
		<threadPool id="pool" threadName="Thread-dataformat"
			poolSize="50" maxPoolSize="200" maxQueueSize="250" rejectedPolicy="CallerRuns" />
	<route>  
            <from uri="file:f:/tmp/inbox?delay=30000"/>  
            <process ref="fileConverter"/>  
            <to uri="file:f:/tmp/outbox"/> 
            <to uri="direct://start"/>   
        </route> 
        
         <route> 
	        <from uri="direct://start"/>  
         	<threads executorServiceRef="pool">
			<process ref="fileConverter"/> 
			<to uri="bean://fileConverter2"/>  
         	</threads> 
        </route>
	</camelContext>

 注意到上面第二個路由<route  />中to的配置被放在一個執行緒池當中了,這也是比較常見的用法。這裡表明流程經過fileConverter處理,流向fileConverter2繼續處理。

另外,我們常常需要根據某一條件判斷流程的“下一步”應該走向哪裡,這時候就要用到類似el表示式的if else判斷了。再定義一個fileConverter3,表明根據條件選擇——流程在經過fileConverter時,根據配置條件選擇“下一步”流向fileConverter2還是fileConverter3(fileConverter2和fileConverter3定義省略,它們都得實現Processor介面

<bean id="fileConverter" class="com.xxxx.FileConvertProcessor" />
	<bean id="fileConverter2" class="com.xxx.FileConvertProcessor2" />
	<bean id="fileConverter3" class="com.xxx.FileConvertProcessor3" />
	
<camelContext id="camel" autoStartup="true" xmlns="http://camel.apache.org/schema/spring">
		 <template id="producerTemplate" />
		<threadPool id="pool" threadName="Thread-dataformat"
			poolSize="50" maxPoolSize="200" maxQueueSize="250" rejectedPolicy="CallerRuns" />
	<route>  
            <from uri="file:f:/tmp/inbox?delay=30000"/>  
            <process ref="fileConverter"/>  
            <to uri="file:f:/tmp/outbox"/> 
            <to uri="direct://start"/>   
        </route> 
        
         <route> 
	        <from uri="direct://start"/>  
         	<threads executorServiceRef="pool">
         		<choice>
         			<when>
         				<simple>${body.length} > 40</simple>
			            <process ref="fileConverter"/> 
			            <to uri="bean://fileConverter2"/>  
         			</when>
         			<otherwise>
         			 <process ref="fileConverter"/> 
			         <to uri="bean://fileConverter3"/>
			        </otherwise>
         		</choice>
         	</threads> 
        </route>
</camelContext>

 <choice />和<otherwise />即表示選擇分支,而<when />下的<simple />標籤則用來放判斷條件,寫法和el表示式的條件判斷很類似。

注意Camel流程的開始時,應該在Java程式碼中用ProducerTemplate.sendBody("direct://xxx",data)開始流程的源頭。ProducerTemplate是從配置檔案的bean獲取(<template id="producerTemplate" />)的,然後ProducerTemplate.start()啟動Camel流程。然後在配置檔案中通過<from uri="direct://xxx"/>開始接收流程傳過來的data資料。

相關推薦

Camel框架快速認識使用

Camel流程框架是Apache下的一個開源專案,是較為成熟的流程框架。在web專案中也可以無縫地集成於Spring當中。 一、簡單使用 引入camel相關的jar包:camel-core-2.10.4.jar。 1、經典的入門示例——檔案移動 public class FileMoveWithCam

快速認識使用瀏覽器跟蹤Http服務及Http服務除錯工具

HTTP(Hyper Text Transfer Protocol)即超文字傳輸協議,是目前網際網路行業使用最為廣泛的一種網路協議,採用請求/響應模型。客戶端向伺服器傳送一個請求,請求頭包含請求的方法、URI、協議版本、以及包含請求修飾符、客戶資訊和內容的類似於MIME的

Facebook開源Caffe2深度學習框架 開發者可快速訓練迭代AI模型

在Facebook與NVIDIA的合作中,工程師基於NVIDIA的GPU平臺深度優化了Caffe2。Caffe2深度學習框架中採用最新的NVIDIA深度學習SDK庫(cuDNN,cuBLAS和NCCL)來提供高效能運算,多GPU加速的訓練以及推理。由於Caffe2在NVIDIA GPU的平臺上的優異表現,使用

讓你快速認識flume及安裝使用flume1.5傳輸資料(日誌)到hadoop2.2 文件 安裝問題

1.啟動log4j警告,沒反應了 log4j:WARN No appenders could be found for logger (org.apache.flume.lifecycle.LifecycleSupervisor). log4j:WARN Please in

教你快速認識mapreducehadoop

鄧芃喜歡吃餃子,他跟媽媽說我要吃餃子.媽媽說,你去準備,韭菜,蝦仁,雞蛋,生薑,豬肉.於是鄧芃去市場買了回來,清水洗淨後,把韭菜,生薑放在一個籃筐裡,雞蛋,蝦仁,豬肉放在一個籃筐裡.其實他所做的這個過程就叫做map.媽媽看了看籃筐裡的豬肉,蝦仁說,這能包多少啊?夠我們一

讓你快速認識flume及安裝使用flume1.5傳輸資料(日誌)到hadoop2.2

轉自:http://www.aboutyun.com/thread-7949-1-1.html 問題導讀:1.什麼是flume?2.如何安裝flume? 3.flume的配置檔案與其它軟體有什麼不同? 一、認識flume1.flume是什麼?這裡簡單介紹一下,它是Cloud

android快速開發框架--快速實現 頁面 載入中 載入失敗 無資料等狀態以及下拉重新整理自動載入

RapidDevelop-Android快速開發框架 框架持續更新中 這個框架是從平時專案裡用的比較多的框架裡整合而來 對本專案感興趣的可以一起研究喜歡的朋友歡迎star 同時也歡迎大家的寶貴意見issues 如果大家對MVP模式的開發 網路爬蟲以及快取策略

yii2 框架的 AR DAO 增刪改查

寫法 mod sar 增刪改查 title isn function rec 自己 自己做個總結 方便以後查找使用 /** * yii 的增刪改查 */ //增 public function add1($data) {

認識學習bash

linu log echo 開頭 快速 數字 .com shells pre 查看linux下shells: [[email protected]/* */ etc]$ vim /etc/shells 查看登入時取得到的shell: [[email&#

Django框架代碼nginx的整合部署

django nginx1. nginx 安裝不在此闡述,直接上關鍵配置 server { listen 80; server_name _; access_log /var/log/nginx/platform_admin.log m

BOS項目 第7天(shiro權限框架進行認證授權)

ebs setattr not action 錯誤信息 add 流程圖 元素 錯誤提示 BOS項目筆記 第7天 今天內容安排: 1、權限概述(認證、授權) 2、常見的權限控制的方式(URL攔截權限控制、方法註解權限控制) 3、權限數據模型(權限表、角色表、用戶表、角色權

使用JavaTodo框架快速搭建網站

java環境 一段時間 紀念 新手 網站 收獲 不能 選擇 web 最近一段時間一直忙著做一個網站,這是我們導師接的一個私活,現在基本功能算是完成了。比較有收獲的是了解了JavaTodo框架。寫一些東西留作紀念吧。如果對於同樣是Web方面新手的你有一絲絲幫助。 以前用ser

思辨“從外至內的認識表達”——By Me at 20140928

前期準備 現在 框架 思考 體會 過程 str 思路 基於 從下面幾個維度,來思辨“從外至內的認識和表達” 【思考維度1】提到研發前期的架構工作,一定要基於這

理性的認識使用搜索引擎進行網的推廣

購物 客戶 不同的 如果 建設 們的 有一個 引擎 分析 網站分不同的類型,對搜索引擎的使用也是不一樣的。如果我們建立的是門戶網站,或者是給客戶提供服務的網站,前期通過搜索引擎進行推廣的目的是,讓客戶找到我們的,並且記住的網站域名,便於以後直接進入我們的網站,

pycharm中查看快速幫助python官方幫助文檔

external img 查看 cnblogs image blog extern 技術分享 視圖 把光標放在要查詢的對象上,打開視圖菜單,quick definition查看對象的定義,quick documentation 快速文檔,這個是jet brains自己對py

SSH框架整體理解總結

程序員 mapper 集成 開發效率 beans 緩沖 -h 服務器端 邏輯 首先,SSH不是一個框架,而是多個框架(struts+spring+hibernate)的集成,是目前較流行的一種Web應用程序開源集成框架,用於構建靈活、易於擴展的多層Web應用程序。 集成

Spring框架—— IOC容器Bean的配置

單引號 framework 將不 配置信息 init 字符串連接 生命 release exp 1 IOC和DI ①IOC(Inversion of Control):反轉控制。 在應用程序中的組件需要獲取資源時,傳統的方式是組件主動的從容器中獲取所需要的資源,在這樣的模

[01] 註解的基本認識元註解

ons 方法 ide 參考 ive img 重寫 列表 bject 1、什麽是註解用一個詞就可以描述註解,那就是元數據,即一種描述數據的數據。所以,可以說註解就是源代碼的元數據。@Overridepublic String toString() { return "T

快速矩陣快速冪模板

style class 計算 res can scan urn oid 模板 快速冪模板: ll qmod(ll x,ll n,ll mod) { ll res=1; while(n){ if(n&1) res=(res*x)%mo

Redis基本認識基礎學習-基本命令

ast val 認識 鍵值 port 4.6 strong 4.5 服務器 Redis 基本介紹 REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。 Redis是一個開源的使用AN