Karaf教程第5部分-在OSGi中執行 Apache Camel整合
這教程演示如何在OSGi伺服器Apache Karaf上執行camel路由。與CXF類似,我們使用blueprint啟動camel。本教程演示三個例子:一個簡單的blueprint路由、一個jms2rest介面卡和一個有序處理的例子。
安裝Camel特性
- 啟動bin\karaf.bat或者bin/karaf(unix)
在Karaf中,鍵入如下命令:
feature:repo-add camel 2.16.2 feature:list |
你應該能看到camel特性已經準備好安裝了。
獲取示例程式碼,並構建
所以你可以clone git倉庫,或者就下載下來,然後解壓到某個目錄。要構建程式碼,只需要這麼做:
cd camel
mvn clean install
啟動簡單示例(用純blueprint部署)
我們的第一個例子甚至不需要一個java工程。在Karaf中,可以部署純blueprint xml檔案。由於camel與blueprint很好的整合,所以你可以在簡單的blueprint檔案中定義一個帶有路由的完整的camel上下文。
camel上下文的blueprint
xml非常類似於spring。主要是名稱空間不同。Blueprint發現依賴於camel,所以它會自動安裝camel-blueprint特性。路由中的Camel元件作為OSGi服務被發現。所以只要camel元件使用So
as soon as
所以要安裝上面的基於blueprint的camel整合,你只需做下面的幾步:
feature:install camel-blueprint camel-stream
複製simple-camel-blueprint.xml到karaf的deploy目錄。你應該能在控制檯看到每5秒列印一次"Hello Camel"。
Blueprint檔案會被自動監視,只要它發生變化,這些改變就會反映到Karaf中。為了嘗試一下,用編輯器開啟deploy/simple-camel-blueprint.xml檔案,將"stream:out"修改為"log:test"
JMS to REST Adapter (jms2rest)
這個例子不是獨立的。前提要先安裝Karaf教程第4部分中的person服務例子。
這個例子演示如何將訊息世界橋接到REST服務上。它是足夠簡單的,你可能只需要定義個純blueprint檔案,就像上面的例子那樣。任何更大的整合需要一些Java程式碼的,我都選擇使用java工程。
像大多數情況一樣,我們主要使用預設配置的maven bundle plugin將工程打包為bundle。Camel上下文使用blueprint檔案啟動,路由定義在java類中。
路由
第一個路由是監視目錄"in",將該目錄下的任何檔案的內容寫入到jms佇列"person"。它不是嚴格必須的,但是這樣手動測試示例會更加簡單。
第2個路由是實際的jms2rest介面卡。它監聽jms佇列person,期望獲取person的xml內容,就像PersonService中用到的那樣。在路由中,person的id是從xml中抓取的,並存儲到camel訊息頭中。這個頭然後被用於構建rest的uri。由於最後一步,訊息的內容被用PUT請求傳送到rest uri。所以它告訴服務用給定的id和資料儲存person。
使用Properties
除了純路由,這個例子說明了一些在camel中需要的通用的東西。所以將我們訪問的url具體化是最佳實踐。Camel使用Properties元件完成這個任務。
這能讓我們用簡單的語言在終端點寫入{{personServiceUri}}或者${properties:personServiceUri}。
在blueprint上下文中,Properties元件是自動從Config Admin服務注入的。 我們使用cm:property-placeholder定義注入config admin pid "net.lr.tutorial.karaf.cxf.personservice"的屬性。由於可能沒有這樣的pid,我們也定義了personServiceUri的預設值,所以部署整合部需要進一步配置。
JMS元件
我們在路由中使用camel jms元件。這是一個需要進一步配置才能工作的元件。我們在blueprint上下文中通過定義JmsComponent和注入連線工廠進行配置。在OSGi中,最佳實踐是不要在bundle中定義連線工廠或資料來源工廠,相反我們簡單地使用OSGi服務引用引用它。
部署並測試jms2rest介面卡
在karaf控制檯鍵入如下命令:
feature:repo-add activemq 5.12.2 feature:repo-add camel 2.16.2 feature:install camel-blueprint camel-jms camel-http camel-saxon activemq-broker jms jms:create -t activemq localhost install -s mvn:net.lr.tutorial.karaf.camel/example-jms2rest/1.0-SNAPSHOT |
這會安裝activemq和camel特性檔案。activemq:create命令在deploy資料夾建立代理定義。這個代理會自動啟動。代理定義也為適合的連線工廠釋出OSGi服務。這個稍後會在我們的bundle中引用。
最後一步,安裝了我們自己的camel路由bundle。
當鍵入如下命令時,應該能看到路由:
> camel:route-list Route Id Context Name Status [file2jms ] [jms2rest ] [Started ] [personJms2Rest ] [jms2rest ] [Started ] |
現在將檔案src/test/resources/person1.xml複製到karaf目錄下的"in"資料夾。這個檔案應該被第一條路由傳送到佇列person,然後被第二條路由傳送到rest服務。
如果安裝了personservice,你應該能看到類似於"Update request received for ..."的訊息。如果沒有安裝personservice服務,那麼當訪問rest服務時,你應該能看到404錯誤。
訂單處理示例
這個例子中的業務案例是一個商店,這個商店與外部商販一起工作。
我們接收到一個xml檔案的訂單(參見。這個訂單包含一個customer元素和幾個item元素。每一個item指定一個商販。這個item要麼是"direct"(自己派送item),要麼是外部的商販名字。如果item的商販是direct,那麼這個item應該被匯出檔案到用customer名字命名的目錄中。所有其他的item都是通過郵件傳送。郵件內容應該是可自定義的,郵件地址是從將商販名字對映到郵件地址的服務獲取的。
它是怎麼工作的
這個例子再次使用maven構建,用上下文啟動camel,java類構建camel路由。所以從OSGi的角度看,它跟jms2rest例子幾乎是一樣的。
路由定義在net.lr.tutorial.karaf.camel.order.OrderRouteBuilder中。"order"路由監聽目錄"orderin",期望xml訂單檔案放置到這個目錄。路由使用xpath將訂單的屬性提取到訊息頭。分離器用於分別處理每一個(/order/item)。然後基於內容的router用於處理來自其他路由的不同的"direct" item。
至於direct item,recipientlist模式被用於使用簡單語言表示式動態構建目的資料夾。
recipientList(simple("file:ordersout/${header.customer}")) |
如果商販不是"direct",那麼路由"mailtovendor"會被呼叫,以建立併發送郵件到商販。主題和目的地址使用特殊的郵件元件能夠理解的頭名字設定。訊息體期望是郵件的內容。由於訊息體應該是可配置的,velocity元件用於向檔案填寫來自頭的值(期望的)。
部署到karaf
部署類似於之前的例子,但是更簡單點,我們不需要jms。在karaf中鍵入下面的命令 :
feature:repo-add camel 2.16.2 feature:install camel-blueprint camel-mail camel-velocity camel-stream install -s mvn:net.lr.tutorial.karaf.camel/example-order/1.0-SNAPSHOT |
為了能收到郵件,你還需要編譯配置pid。你也可以將屬性檔案放到etc/net.lr.tutorial.karaf.cxf.personservice.cfg,或者使用karaf webconsole編譯配置pid。(參見Karaf教程第2部分和第3部分).
從根本上說,你需要設定在你自己的郵件環境中設定這些屬性。
mailserver=yourmailserver.com |
測試訂單示例
將檔案複製到karaf目錄下的資料夾"ordersin"。
Karaf控制檯將會顯示::
Order from Christian Schneider Count: 1, Article: Flatscreen TV |
這與你郵箱的收件箱裡是一樣的。同時,ordersout/Christian Schneider/order1.xml檔案會被建立,檔案中包含book item。
總結和展望
這些示例演示了camel可以完成相當複雜的整合,可以很好地部署到Apache Karaf容器。這些示例也演示了一些配置管理、jms連線工廠和自定義模板的最佳實踐。這些示例也為你自己整合工程提供了好的起點。許多人在生成環境中使用OSGi還是很猶豫的。我希望這些示例可以說明在實踐中是多麼容易。當然,問題總是有的。如果有問題,建議從供應商例如Talend獲得支援。整個Talend Integration portfolio是基於Apache Karaf,所以我們這個領域是很有經驗的。
在這個教程中,我沒有考慮Apache Camel比較大的使用場景-資料庫整合。這是一個很大的領域, 保證很快就與單獨的教程。我也會解釋如何處理那些和OSGi不相容的driver的資料來源和連線工廠。
相關推薦
Karaf教程第5部分-在OSGi中執行 Apache Camel整合
這教程演示如何在OSGi伺服器Apache Karaf上執行camel路由。與CXF類似,我們使用blueprint啟動camel。本教程演示三個例子:一個簡單的blueprint路由、一個jms2rest介面卡和一個有序處理的例子。 安裝Camel特性 啟動bin\karaf.bat或者bin/kara
Karaf教程第9部分基於註解的blueprint和JPA
本部分演示如何用模型持久層和基於CDI註解的UI建立一個小的應用。 1 blueprint-maven-plugin 編寫blueprint xml檔案是很繁瑣的,太大的blueprint xml檔案很難與程式碼修改保持同步,尤其是程式碼重構。所以很多人喜歡使用註解來進行
Karaf教程第2部分 使用Configuration Admin服務
在Karaf教程的第1部分,我們學習瞭如何使用maven和blueprint提供和使用pojo服務,如何使用http服務釋出servlet。 在第2部分,我們集中精力關注OSGi bundle的配置。不像servlet容器,OSGi容器包含一個非常好的配置
【安富萊專題教程第5期】工程調試利器RTT實時數據傳輸組件,替代串口調試,速度飛快,可以在中斷和多任務中隨意調用
中斷 現在 ron borde AS get bubuko 串口調試 需要 說明:1、串口作為經典的調試方式已經存在好多年了,缺點是需要一個專門的硬件接口。現在有了SEGGER的RTT(已經發布有幾年了),無需占用系統額外的硬件資源,而且速度超快,是替代串口調試的絕佳方式。
dos/bat批處理教程——第四部分:完整案例
echo 目錄 發布 判斷 案例 不能 goto 信息 iis dos/bat批處理教程——第四部分:完整案例 以上就是批處理的一些用法。現在我們把這些用法結合起來詳細的分析一下目前網上發布的一些批處理,看看他們是怎麽運作的。這裏我將列舉三個例子來詳細分析,為了保持程序
輕松學習 JavaScript——第 5 部分:簡化函數提升
hello 聲明 auto 我們 ava 簡化 你知道 def 方式 為了理解函數提升,讓我們從以下代碼開啟我們的學習之旅: console.log(foo); var foo = 9;</pre> 應該輸出什麽呢? 在任何其他編程語言中,這裏的輸出將會是re
5.第5講-linux視訊教程第5講 檔案許可權 使用者組1
檔案許可權 使用者組1 ### 1. 檔案所有者、所有組和其他組 ### ###2.檔案所有者、所在組和其他組### ** 如何在linux中新增組** -groupadd policeman 檢視linux中所有組的資訊 -vi /etc/group 看了可以修改 -cat
《2.uboot和系統移植-第5部分-2.5.uboot原始碼分析1-啟動第一階段》
《2.uboot和系統移植-第5部分-2.5.uboot原始碼分析1-啟動第一階段》 第一部分、章節目錄 2.5.1.start.S引入 2.5.2.start.S解析1 2.5.3.start.S解析2 2.5.4.start.S解析3 2.5.5.start.S解析4 2.5.6.s
《5.linux驅動開發-第5部分-5.8.input子系統基礎之按鍵》
《5.linux驅動開發-第5部分-5.8.input子系統基礎之按鍵》 第一部分、章節目錄 5.8.1.什麼是input子系統 5.8.2.input裝置應用層程式設計實踐1 5.8.3.input裝置應用層程式設計實踐2 5.8.4.input子系統架構總覽1 5.8.5.input
《5.linux驅動開發-第5部分-5.5.linux裝置驅動模型》
《5.linux驅動開發-第5部分-5.5.linux裝置驅動模型》 第一部分、章節目錄 5.5.1.linux裝置驅動模型簡介 5.5.2.裝置驅動模型的底層架構 5.5.3.匯流排式裝置驅動組織方式 5.5.4.platform平臺匯流排簡介1 5.5.5.platform平臺匯流排
撩課-Mysql第5部分查詢DQL
學習地址: 撩課-JavaWeb系列1之基礎語法-前端基礎 撩課-JavaWeb系列2之XML 撩課-JavaWeb系列3之MySQL 撩課-JavaWeb系列4之JDBC 撩課-JavaWeb系列5之web伺服器-idea DQL 查詢所有列 SELECT * FROM 表名;
Kaggle word2vec NLP 教程 第三部分:詞向量的更多樂趣
第三部分:詞向量的更多樂趣 程式碼 第三部分的程式碼在這裡。 單詞的數值表示 現在我們有了訓練好的模型,對單詞有一些語義理解,我們應該如何使用它? 如果你看它的背後,第 2 部分訓練的 Word2Vec 模型由詞彙表中每個單詞的特徵向量組成,儲存在一個名為sy
【機器學習系列文章】第5部分:強化學習
目錄 你做到了! 結束思考 探索和開發。馬爾可夫決策過程。Q-learning,政策學習和深度強化學習。 “我只吃了一些巧克力來完成最後一節。” 在有監督的學習中,訓練資料帶有來自某些神聖的“主管”的答案。如果只有這樣的生活! 在強化學
第一個 Django 應用(第 5 部分)
第一個 Django 應用,第 5 部分¶ (測試) 這一篇從 教程第 4 部分 結尾的地方繼續講起。我們在前幾章成功的構建了一個線上投票應用,在這一部分裡我們將為它建立一些自動化測試。 自動化測試簡介¶ 自動化測試是什麼?¶ 測試,是用來檢查程式碼正確性的一些
programming-languages學習筆記--第5部分
programming-languages學習筆記–第5部分 pre.src {background-color: #292b2e; color: #b2b2b2;} programming-languages學習筆記–第5部分 目錄
Java 執行時監控,第 1 部分: Java 系統執行時效能和可用性監控
簡介 當今的許多 Java 應用程式都依賴於一組複雜的分散式依賴關係和移動部件。很多外部因素都可能對應用程式的效能和可用性造成影響。這些影響基本上都無法完全消除或解決,且難以在預生成環境中準確模擬。Stuff happens。但是,您可以建立並維護一個全面的系統來監控應用程式的整個生態系
Alex 的 Hadoop 菜鳥教程: 第5課 YARN 安裝以及helloworld (基於centos的CDH)
原帖地址:http://blog.csdn.net/nsrainbow/article/details/36627675 新老MapReduce的比較 說到YARN肯定要先說下老的MapReduce MRv1 (MapReduce v1)的架構圖 從上圖中可以清楚的看出
Webpack4教程 - 第三部分,如何使用外掛
轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。原文出處:https://wanago.io/2018/07/23/webpack-4-course-part-three-working-with-plugins/ 大家好!今天我們介紹外掛
迴圈神經網路教程第四部分-用Python和Theano實現GRU/LSTM迴圈神經網路
作者:徐志強 連結:https://zhuanlan.zhihu.com/p/22371429 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 本篇教程的程式碼在Github上。這裡是迴圈神經網路教程的最後一部分,前幾部分別是: 本篇中我們將學習LSTM(長短項記憶)網路和G
如何恢復 Linux 上刪除的檔案,第 5 部分
級別: 初級2008 年 3 月 31 日為 了支援更大的檔案系統,ext4 對 ext3 的現有實現進行了一系列擴充,使用 48 位的塊號來增大塊號定址範圍,並採用 extent 的設計來簡化對資料塊的索引,這勢必會影響到磁碟資料結構的變化,以及刪除檔案的恢復。本文將逐一介紹 ext4 在對大檔案系統支