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