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
教你快速認識mapreduce和hadoop
鄧芃喜歡吃餃子,他跟媽媽說我要吃餃子.媽媽說,你去準備,韭菜,蝦仁,雞蛋,生薑,豬肉.於是鄧芃去市場買了回來,清水洗淨後,把韭菜,生薑放在一個籃筐裡,雞蛋,蝦仁,豬肉放在一個籃筐裡.其實他所做的這個過程就叫做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