perl大骆驼和小骆驼_你好骆驼:自动文件传输
perl大駱駝和小駱駝
Apache Camel在其主頁上 (以及Camel用戶指南中 )將其描述為“基于已知企業(yè)集成模式的通用開源集成框架”。 Camel框架基于《 企業(yè)集成模式 》一書,并提供了該書中描述的模式的實(shí)現(xiàn) 。 我看一下這篇文章中使用Camel的“ Hello World”類型示例。
Camel網(wǎng)頁和用戶指南還引用了StackOverflow線程Apache Camel到底是什么? 其中包括對(duì)Apache Camel的一些很好的描述。 David Newcomb在那兒描述了駱駝:
Apache Camel是消息傳遞技術(shù)與路由的結(jié)合。 它將消息傳遞的起點(diǎn)和終點(diǎn)連接在一起,從而允許將消息從不同的源傳輸?shù)讲煌哪康牡亍?例如:JMS-> JSON,HTTP-> JMS或渠道FTP-> JMS,HTTP-> JMS,JMS => JSON。
在本文中,我介紹了一種簡單的Camel用法,它不需要使用JMS提供程序,甚至不需要FTP或HTTP。 保持簡單的示例可以使您更清楚地使用Camel。 本示例使用Camel自動(dòng)將文件從指定目錄傳輸?shù)狡渌付夸洝?將演示三種情況。
在第一種情況下,放置在“輸入”目錄中的文件會(huì)自動(dòng)復(fù)制到“輸出”目錄,而不會(huì)影響源文件。 在第二種情況下,放置在“輸入”目錄中的文件會(huì)自動(dòng)復(fù)制到“輸出”目錄,然后將“輸入”目錄中的文件存儲(chǔ)在“輸入”目錄下的特殊“ .camel”子目錄中。 第三種情況是在復(fù)制到“輸出”目錄(實(shí)際上是“移動(dòng)”操作)后,從“輸入”目錄中刪除文件。 這三種情況都是用幾乎相同的代碼實(shí)現(xiàn)的。 兩者之間的唯一區(qū)別是在一行中指定了Camel應(yīng)該如何處理文件傳輸。
下一個(gè)代碼清單顯示了使用Camel自動(dòng)將放置在輸入目錄中的文件復(fù)制到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());} }上面的代碼演示了對(duì)Camel API和Camel的Java DSL支持的最少使用。 CamelContext是用DefaultCamelContext的實(shí)例定義的(第10行)。 第13-21行將駱駝路線添加到此實(shí)例化的上下文中,第22行開始上下文,第24行停止上下文。 這一切都非常簡單,但是對(duì)我來說最有趣的部分是第19行的路由規(guī)范。
因?yàn)閷?shí)現(xiàn)提供給Camel Context的RoutesBuilder接口的實(shí)例只需要重寫其抽象configure方法,所以可以很容易地將類實(shí)例化為與CamelContext.addRoutes(RoutesBuilder)內(nèi)聯(lián)的匿名類。 這是我在上面的代碼中所做的,也是在許多在線提供的Camel示例中所做的事情。
第19行顯示了高度可讀的語法,描述了路由的“從”和“到”部分。 在這種情況下,放置在輸入目錄(“ from”)中的文件將被復(fù)制到輸出目錄(“ to”)。 “文件”協(xié)議可用于“發(fā)件人”和“發(fā)件人”部分,因?yàn)槲募到y(tǒng)是“消息”的來源和去向。 “ from”調(diào)用中的“?noop = true”表示對(duì)“ input”目錄中的文件不做任何更改(處理應(yīng)對(duì)源文件產(chǎn)生“ noop”作用)。
如前所述,以上代碼中的第19行指示Camel將“輸入”目錄中已經(jīng)存在或放置的文件復(fù)制到指定的“輸出”目錄,而不會(huì)影響“輸入”目錄中的文件。 在某些情況下,我可能想“移動(dòng)”文件而不是“復(fù)制”它們。 在這種情況下,當(dāng)指定“ from”端點(diǎn)時(shí),可以指定?delete=true而不是?noop=true 。 換句話說,上面的第19行可以替換為將文件放置在“輸出”目錄中時(shí)從“輸入”目錄中刪除文件。 如果在輸入上未指定任何參數(shù)( ?noop=true或?delete=true ),則將發(fā)生介于兩者之間的操作:“ input”目錄中的文件將移至該目錄下的一個(gè)專門創(chuàng)建的新子目錄中。 “輸入”目錄稱為.camel 。 接下來將突出顯示這三種情況。
從數(shù)據(jù)文件\輸入復(fù)制到數(shù)據(jù)文件\輸出的文件,而不會(huì)影響原始文件
from('file:C:\\datafiles\\input?noop=true').to('file:C:\\datafiles\\output');文件從數(shù)據(jù)文件\輸入移至數(shù)據(jù)文件\輸出
from('file:C:\\datafiles\\input?delete=true').to('file:C:\\datafiles\\output');從datafiles \ input復(fù)制到datafiles \ output的文件,并將原始文件移到.camel子目錄
from('file:C:\\datafiles\\input').to('file:C:\\datafiles\\output');附帶說明一下,流暢的'from'和'to'的使用是Camel的Java DSL的示例。 Camel通過實(shí)現(xiàn)繼承(在RouteBuilder類中定義了“ from”和“ to”之類的方法)而不是通過靜態(tài)導(dǎo)入 ( 通常用于基于Java的DSL的方法) 來實(shí)現(xiàn)此目的。
盡管將RouteBuilder匿名實(shí)例RouteBuilder給Camel Context是很常見的,但這不是RouteBuilder的。 在某些情況下,擁有擴(kuò)展RouteBuilder獨(dú)立類以及將這些擴(kuò)展類的實(shí)例傳遞給Camel Context的情況是有利的。 我將使用這種方法來演示我之前描述的所有三種情況。 下一個(gè)代碼清單顯示了擴(kuò)展RouteBuilder的類。 在許多情況下,我將使用無參數(shù)構(gòu)造函數(shù),但在這種情況下,我將使用構(gòu)造函數(shù)來確定駱駝路線應(yīng)支持哪種類型的文件傳輸。
下一個(gè)代碼清單顯示了一個(gè)命名的獨(dú)立類,該類處理上述所有三種情況(復(fù)制,使用輸入文件歸檔進(jìn)行復(fù)制以及移動(dòng))。 RouteBuilder單個(gè)擴(kuò)展在其構(gòu)造函數(shù)中使用一個(gè)枚舉來確定如何配置輸入端點(diǎn)。
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輕松地將文件從一個(gè)目錄路由到另一個(gè)目錄。 駱駝支持許多其他的傳輸機(jī)制和數(shù)據(jù)格式,這里沒有顯示。 駱駝還支持轉(zhuǎn)換要路由的消息/數(shù)據(jù)的功能,此處也未顯示。 這篇文章重點(diǎn)介紹了如何以有用的方式應(yīng)用Camel的最簡單的示例,但是Camel支持的遠(yuǎn)遠(yuǎn)超過此簡單示例中顯示的內(nèi)容。
參考: Hello Camel:來自JCG合作伙伴 Dustin Marx的“ 實(shí)際事件啟發(fā)”博客中的自動(dòng)文件傳輸 。
翻譯自: https://www.javacodegeeks.com/2013/02/hello-camel-automatic-file-transfer.html
perl大駱駝和小駱駝
總結(jié)
以上是生活随笔為你收集整理的perl大骆驼和小骆驼_你好骆驼:自动文件传输的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果手机套(苹果手机套哪个牌子好)
- 下一篇: redis 持久化性能_高性能持久消息