你好駱駝:自動文件傳輸

Apache Camel在其主頁上 (以及Camel用戶指南中 )將其描述為“基于已知企業集成模式的通用開源集成框架”。 Camel框架基于《 企業集成模式 》一書,并提供了該書中描述的模式的實現 。 我看一下這篇文章中使用Camel的“ Hello World”類型示例。

Camel網頁和用戶指南還引用了StackOverflow線程Apache Camel到底是什么? 其中包括對Apache Camel的一些很好的描述。 David Newcomb在那兒描述了駱駝:


Apache Camel是消息傳遞技術與路由的結合。 它將消息的起點和終點連接在一起,從而允許將消息從不同的源傳輸到不同的目的地。 例如:JMS-> JSON,HTTP-> JMS或渠道FTP-> JMS,HTTP-> JMS,JMS => JSON。

在本文中,我介紹了一種簡單的Camel用法,它不需要使用JMS提供程序,甚至不需要FTP或HTTP。 保持簡單的示例可以使您更清楚地使用Camel。 本示例使用Camel自動將文件從指定目錄傳輸到其他指定目錄。 將演示三種情況。

在第一種情況下,放置在“輸入”目錄中的文件會自動復制到“輸出”目錄,而不會影響源文件。 在第二種情況下,放置在“輸入”目錄中的文件會自動復制到“輸出”目錄,然后將“輸入”目錄中的文件存儲在“輸入”目錄下的特殊“ .camel”子目錄中。 第三種情況是在復制到“輸出”目錄時(實際上是“移動”操作)從“輸入”目錄中刪除文件。 這三種情況都是用幾乎相同的代碼實現的。 兩者之間的唯一區別在于指定Camel如何處理文件傳輸的一行。

下一個代碼清單顯示使用Camel自動將放置在輸入目錄中的文件復制到Camel所需要的基本代碼。

/*** Simple executable function to demonstrate Camel file transfer.* * @param arguments Command line arguments; excepting duration in milliseconds*    as single argument.*/
public static void main(final String[] arguments)
{final long durationMs = extractDurationMsFromCommandLineArgs(arguments);final CamelContext camelContext = new DefaultCamelContext();try{camelContext.addRoutes(new RouteBuilder(){@Overridepublic void configure() throws Exception{from('file:C:\\datafiles\\input?noop=true').to('file:C:\\datafiles\\output');}});camelContext.start();Thread.sleep(durationMs);camelContext.stop();}catch (Exception camelException){LOGGER.log(Level.SEVERE,'Exception trying to copy files - {0}',camelException.toString());}
}

上面的代碼演示了對Camel API和Camel的Java DSL支持的最小使用。 CamelContext是使用DefaultCamelContext的實例定義的(第10行)。 第13-21行將駱駝路線添加到此實例化的上下文中,第22行開始上下文,第24行停止上下文。 這一切都非常簡單,但是對我來說最有趣的部分是第19行的路由規范。

因為實現提供給Camel Context的RoutesBuilder接口的實例僅需要覆蓋其抽象configure方法,所以通過調用CamelContext.addRoutes(RoutesBuilder)來將其實例化為一個匿名類很容易類。 這是我在上面的代碼中所做的,也是在許多在線提供的Camel示例中所做的事情。

第19行顯示了高度可讀的語法,描述了路由的“從”和“到”部分。 在這種情況下,放置在輸入目錄(“ from”)中的文件將被復制到輸出目錄(“ to”)。 “文件”協議可用于“發件人”和“發件人”部分,因為文件系統是“消息”的發件人和發件人。 “ from”調用中的“?noop = true”表示“輸入”目錄中的文件不應進行任何更改(處理應對源文件產生“ noop”作用)。

如前所述,上面代碼中的第19行指示Camel將“輸入”目錄中已經存在或放置的文件復制到指定的“輸出”目錄,而不會影響“輸入”目錄中的文件。 在某些情況下,我可能想“移動”文件而不是“復制”它們。 在這種情況下,當指定“ from”端點時,可以指定?delete=true而不是?noop=true 。 換句話說,上面的第19行可以替換為將文件放置在“輸出”目錄中時從“輸入”目錄中刪除文件。 如果未在輸入上指定任何參數( ?noop=true?delete=true ),則將發生介于兩者之間的操作:“ input”目錄中的文件將移動到目錄下的一個專門創建的新子目錄中。 “輸入”目錄稱為.camel 。 接下來將突出顯示這三種情況。

從數據文件\輸入復制到數據文件\輸出的文件,而不會影響原始文件

from('file:C:\\datafiles\\input?noop=true').to('file:C:\\datafiles\\output');

文件從數據文件\輸入移至數據文件\輸出

from('file:C:\\datafiles\\input?delete=true').to('file:C:\\datafiles\\output');

從datafiles \ input復制到datafiles \ output的文件,并將原始文件移到.camel子目錄

from('file:C:\\datafiles\\input').to('file:C:\\datafiles\\output');

附帶說明一下,流暢的'from'和'to'的使用是Camel的Java DSL的示例。 Camel通過實現繼承(在RouteBuilder類中定義了諸如“ from”和“ to”之類的方法)而不是通過靜態導入 ( 通常用于基于Java的DSL的方法) 來實現此目的。

盡管將RouteBuilder匿名實例RouteBuilder給Camel Context是很常見的,但這不是RouteBuilder的。 在某些情況下,擁有擴展RouteBuilder獨立類以及將這些擴展類的實例傳遞給Camel Context的情況是有利的。 我將使用這種方法來演示我之前描述的所有三種情況。 下一個代碼清單顯示了擴展RouteBuilder的類。 在許多情況下,我將使用無參數構造函數,但是在這種情況下,我將使用構造函數來確定駱駝路線應支持哪種類型的文件傳輸。

下一個代碼清單顯示了一個命名的獨立類,該類處理上述所有三種情況(復制,使用輸入文件歸檔進行復制以及移動)。 RouteBuilder單個擴展在其構造函數中使用一個枚舉來確定如何配置輸入端點。

package dustin.examples.camel;import org.apache.camel.builder.RouteBuilder;/*** Camel-based Route Builder for transferring files.* * @author Dustin*/
public class FileTransferRouteBuilder extends RouteBuilder
{public enum FileTransferType{COPY_WITHOUT_IMPACTING_ORIGINALS('C'),COPY_WITH_ARCHIVED_ORIGINALS('A'),MOVE('M');private final String letter;FileTransferType(final String newLetter){this.letter = newLetter;}public String getLetter(){return this.letter;}public static FileTransferType fromLetter(final String letter){FileTransferType match = null;for (final FileTransferType type : FileTransferType.values()){if (type.getLetter().equalsIgnoreCase(letter)){match = type;break;}}return match;}}private final String fromEndPointString;private final static String FROM_BASE = 'file:C:\\datafiles\\input';private final static String FROM_NOOP = FROM_BASE + '?noop=true';private final static String FROM_MOVE = FROM_BASE + '?delete=true';public FileTransferRouteBuilder(final FileTransferType newFileTransferType){if (newFileTransferType != null){switch (newFileTransferType){case COPY_WITHOUT_IMPACTING_ORIGINALS :this.fromEndPointString = FROM_NOOP;break;case COPY_WITH_ARCHIVED_ORIGINALS :this.fromEndPointString = FROM_BASE;break;case MOVE :this.fromEndPointString = FROM_MOVE;break;default :this.fromEndPointString = FROM_NOOP;}}else{fromEndPointString = FROM_NOOP;}}@Overridepublic void configure() throws Exception{from(this.fromEndPointString).to('file:C:\\datafiles\\output');}
}

這篇博客文章演示了如何使用Camel輕松地將文件從一個目錄路由到另一個目錄。 駱駝支持許多其他的傳輸機制和數據格式,這里沒有顯示。 駱駝還支持轉換要路由的消息/數據的功能,此處也未顯示。 這篇文章重點介紹了如何以有用的方式應用Camel的最簡單的示例,但是Camel支持的遠遠超過此簡單示例中所示。

參考: Hello Camel: JCG合作伙伴 Dustin Marx在Inspired by Actual Events博客上的自動文件傳輸 。

翻譯自: https://www.javacodegeeks.com/2013/02/hello-camel-automatic-file-transfer.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370187.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370187.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370187.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 常用命令二 pwd cd

一、pwd命令 顯示整個路徑名: wangwang:~$ pwd /home/wang 二、cd命令 切換到其他路徑(相對路徑方式): wangwang:~$ cd workpalce/ wangwang:~/workpalce$ pwd /home/wang/workpalce 切換到其他路徑(絕對路徑方式&…

3dobject用什么打開_第一次用開塞露是什么感覺?網友:像打開了新世界的大門

第一次用開塞露是什么感覺?網友:像打開了新世界的大門我媽說我小時候便秘去醫院,醫生給開了支開塞露,然后在醫院的公廁里使用的,我媽的描述是:“要不是我手挪走的快點,就直接噴我手了”。。。。。。。。。。。。。。。…

linux root郵箱地址,linux – 如何將root的電子郵件轉發到外部電子郵件地址?

我家里有一臺小型服務器(Ubuntu 10.04),我想將root的電子郵件轉發到我的gmail托管域,以獲取安全通知,什么不是.我把所有東西都撕掉了,然后從頭開始跑到other issues.我現在有sendmail工作,我可以發郵件到someexternal.com并收到郵件.但是,向/root/.forward添加地址實際上并不轉…

RHEL6.4 xclock安裝小記

http://blog.sina.com.cn/s/blog_623630d50101tc67.html轉載于:https://www.cnblogs.com/Baronboy/p/7077911.html

Java 7中對String.substring的更改

眾所周知,在您生成相同源字符串的許多子字符串的情況下,Java會優化子字符串操作。 它通過使用(value, offset, count)存儲信息的方式來做到這一點。 請參閱以下示例: 在上圖中,您會看到字符串“ Hello”和“ World!”…

原生js創建模態框

1.效果圖如下&#xff1a; 2.代碼如下&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"><title>Test</title><style>#pageMask {visibility: hidden; position: absolute;left: 0px; top: 0px;width:…

python查詢oracle數據庫_python針對Oracle常見查詢操作實例分析

本文實例講述了python針對Oracle常見查詢操作。分享給大家供大家參考&#xff0c;具體如下&#xff1a;1.子查詢(難)&#xff1a;當進行查詢的時候&#xff0c;發現需要的數據信息不明確&#xff0c;需要先通過另一個查詢得到&#xff0c;此查詢稱為子查詢&#xff1b;執行順序…

按鈕事件處理(3)

在進行gui編程時&#xff0c;我們最常使用的控件時按鈕&#xff0c;在java中JButton類代表了按鈕。它的類層次結構圖是&#xff1a; java.lang.Object|_ java.awt.Component|_java.awt.Container|_javax.swing.JComponent|_javax.swing.AbstractButton|_javax.swing.JButton我們…

linux下I2C驅動發送IO時序,Linux I2C 驅動閱讀的碰到的一些網上沒有提到的東西

# re: Linux I2C 驅動閱讀的碰到的一些網上沒有提到的東西 回復 更多評論2009-04-11 13:39 by 初學都樓主&#xff0c;你好。我看了你那篇《Linux I2C核心、總線與設備驅動[轉]》&#xff0c;讓我明白了不少&#xff0c;不過我還是有些不明白的地方&#xff0c;想請教一下。我…

Java內存模型和優化

總覽 許多多線程代碼開發人員都熟悉這樣的想法&#xff0c;即不同的線程可以對持有的值有不同的看法&#xff0c;這不是唯一的原因&#xff0c;即如果線程不安全&#xff0c;它可能不會看到更改。 JIT本身可以發揮作用。 為什么不同的線程看到不同的值&#xff1f; 當您有多個…

C_數組詳解

數組&#xff1a; 一 一維數組 1.1 一維數組的定義: 類型符 數組名[常量表達式]; int a[10]; 說明: 1.數組的命名規則遵循標識符命名規則。 2.定義時需要指定元素的個數。方括號里的常量表達式表示元素的個數。 3.常量表達式中不能包含變量&#xff1b;如&#xff1a;int a[n];…

CSS節選——選擇器

CSS&#xff0c;cascading style sheet&#xff0c;層疊樣式表&#xff0c;請留意層疊概念。 css3為了區分偽類和偽元素&#xff0c;偽元素采用雙冒號寫法。 常見偽類——:hover,:link,:active,:target,:not(),:focus。 常見偽元素——::first-letter,::first-line,::before…

python游戲循環設置_Pygame:游戲循環前的初始菜單

我正在制作一個this game的版本&#xff0c;并嘗試將起始菜單設置為&#xff1a;我的計劃是先做surface.fill(overlaycolor)&#xff0c;然后將這個圖像blitting到屏幕上。在一個while循環中。之后&#xff0c;在用戶想玩(另一個問題除外)之后&#xff0c;我們將進入另一個whil…

vue.js基礎知識篇(7):表單校驗詳解

目錄 網盤 第12章:表單校驗 1.npm安裝vue-validator $ npm install vue-validator 代碼示例: var Vuerequire("vue"); var VueValidatorrequire("vue-validator"); Vue.use(VueValidator); 2.直接使用script標簽引入vue.js 要下載vue-validator&#xff0c…

修改linux綁定的域名,手工修改linux系統下DA面板綁定的域名

舉例說明手工修改DA面板下虛擬主機ryan綁定的域名&#xff0c;只需要 vi /usr/local/directadmin/data/users/ryan/httpd.conf代碼如下&#xff1a;# Auto generated apache config file by DirectAdmin version 1.46.3# Modifying this file is not recommended as any change…

在JUnit測試中使用Builder模式

這并不是要成為技術含量很高的職位。 這篇文章的目的是為您提供一些指導&#xff0c;以使您的JUnit測試生活更加輕松&#xff0c;使您能夠在幾分鐘內編寫復雜的測試場景&#xff0c;并具有易于閱讀的測試優勢。 單元測試中有兩個主要部分&#xff0c;需要編寫許多引導程序代碼&…

SQL數據庫中臨時表、臨時變量和WITH AS關鍵詞創建“臨時表”的區別

原文鏈接&#xff1a;https://www.cnblogs.com/zhaowei303/articles/4204805.html SQL數據庫中數據處理時&#xff0c;有時候需要建立臨時表&#xff0c;將查詢后的結果集放到臨時表中&#xff0c;然后在針對這個數據進行操作。 創建“臨時表”&#xff08;邏輯上的臨時表&…

python 三維繪圖庫_Python第三方庫matplotlib(2D繪圖庫)入門與進階

Matplotlib一 簡介&#xff1a;Matplotlib是一個Python 2D繪圖庫&#xff0c;它可以在各種平臺上以各種硬拷貝格式和交互式環境生成出具有出版品質的圖形。 Matplotlib可用于Python腳本&#xff0c;Python和IPython shell&#xff0c;Jupyter筆記本&#xff0c;Web應用程序服務…

zbb20170626 myeclipse 2017 ci 構建 spring hibernate struts jar

轉載于:https://www.cnblogs.com/super-admin/p/7081209.html

linux處理機調度實驗報告,模擬Linux操作系統下處理機調度實驗報告

在采用多道系統的設計程序中,往往有若干進程同時處于就緒狀態。當就緒狀態進程數大于處理機數時,就必須按照某種策略來決定哪些進程優先占用處理機。本實驗模擬在單處理機情況下處理機調度處理機調度一、實驗目的&#xff1a;1、了解Linux下Emacs編輯器的使用方法&#xff0c;掌…