apache camel_探索Apache Camel Core –文件组件
apache camel
文件輪詢器是解決常見IT問題的非常有用的機制。 Camel的內置file組件非常靈活,并且有許多選項可用于配置。 讓我們在這里介紹一些常用用法。
輪詢目錄以輸入文件
這是一條典型的駱駝Route用于每秒輪詢一次目錄以查找輸入文件。
使用以下命令運行
mvn compile exec:java -Dexec.mainClass=org.apache.camel.main.Main -Dexec.args='-r camelcoredemo.FileRouteBuilder'該程序將開始輪詢當前目錄下的target/input文件夾,并等待傳入??文件。 要測試輸入文件,您需要打開另一個終端,然后按照以下步驟創(chuàng)建一些文件。
echo 'Hello 1' > target/input/test1.txt echo 'Hello 2' > target/input/test2.txt現(xiàn)在,您應該看到第一個提示窗口開始拾取文件并傳遞到下一個Processor步驟。 在Processor ,我們從消息正文中獲取File對象。 然后,它僅記錄它的文件名。 完成后,您可以按CTRL+C
您可以在URL中使用file組件中的許多可配置選項,但是大多數(shù)默認設置足以使您如上所示。 其中一些默認行為是,如果輸入文件夾不存在,它將創(chuàng)建它。 當文件由Route完成處理后,它將被移入.camel文件夾。 如果在處理后根本不需要文件,則在URL中設置delete=true 。
讀入文件內容并轉換為不同類型
默認情況下, file組件將為找到的每個文件創(chuàng)建一個org.apache.camel.component.file.GenericFile對象,并將其作為消息正文傳遞給Route 。 您可以通過此對象檢索所有文件信息。 或者,您也可以使用Exchange API將郵件正文對象自動轉換為希望接收的類型(例如:與msg.getIn().getBody(File.class) )。 在上面的示例中, File是您希望從消息正文中獲取的類型,因此Camel將嘗試為您轉換文件。 駱駝使用上下文的注冊表空間來預注冊許多TypeConverter ,它們可以處理大多數(shù)常見數(shù)據(jù)類型(例如Java primitive等)的轉換。 這些TypeConverter s為強大的方式來讓你的Route和Processor更flexbile和便攜。
Camel不僅可以從郵件正文轉換您的File對象,還可以讀取文件內容。 如果文件是基于字符文本的,則只需執(zhí)行此操作。
from("file://target/input?charset=UTF-8").process(new Processor() {public void process(Exchange msg) {String text = msg.getIn().getBody(String.class);LOG.info("Processing text: " + text);}});而已! 只需指定String類型,Camel就會讀入您的文件并將整個文件文本內容作為正文消息傳遞。 您甚至可以使用charset更改編碼。
如果要處理二進制文件,則只需嘗試byte[] bytes = msg.getIn().getBody(byte[].class); 轉換。 太酷了吧?
輪詢和處理大文件
處理大文件時, file組件中很少有選項可用于確保正確處理。 例如,您可能想在Route開始處理之前將輸入文件移動到staging文件夾中; 完成后,將其移至.completed文件夾。
from("file://target/input?preMove=staging&move=.completed").process(new Processor() {public void process(Exchange msg) {File file = msg.getIn().getBody(File.class);LOG.info("Processing file: " + file);}});要將輸入文件正確地饋入輪詢文件夾,最好是發(fā)件人首先在一個臨時文件夾中生成輸入文件,然后只有在準備好之后才將其移入輪詢文件夾。 如果輸入文件可能需要花費一些時間來生成,這將最大程度地減少通過Route讀取不完整的文件。 對此的另一種解決方案是將配置file端點配置為僅在存在信號或就緒標記文件時讀取輪詢文件夾。 例如:
from("file://target/input?preMove=staging&move=.completed&doneFileName=ReadyFile.txt").process(new Processor() {public void process(Exchange msg) {File file = msg.getIn().getBody(File.class);LOG.info("Processing file: " + file);}});當存在ReadyFile.txt文件時,以上內容只會讀取target/input文件夾。 標記文件可以只是一個空文件,并且在輪詢后將被Camel刪除。 該解決方案將使發(fā)送者可以花費很長時間生成輸入文件。
大文件處理的另一個問題是避免將整個文件內容加載到內存中進行處理。 為了更實際,您希望將文件拆分為記錄(例如:每行)并一一處理(或稱為“流”)。 這是您使用駱駝做的方法。
from("file://target/input?preMove=staging&move=.completed").split(body().tokenize("\n")).streaming().process(new Processor() {public void process(Exchange msg) {String line = msg.getIn().getBody(String.class);LOG.info("Processing line: " + line);}});此Route將允許您處理大型文件而不會占用太多內存,并且可以非常高效地逐行處理文件。
將消息寫回文件
file組件也可以用于將消息寫入文件。 回想一下,我們可能使用dataset組件來生成樣本消息。 我們將使用它來填充Route并發(fā)送到file組件,以便您看到生成的每個消息都將保存到文件中。
package camelcoredemo;import org.slf4j.*; import org.apache.camel.*; import org.apache.camel.builder.*; import org.apache.camel.main.Main; import org.apache.camel.component.dataset.*;public class FileDemoCamel extends Main {static Logger LOG = LoggerFactory.getLogger(FileDemoCamel.class);public static void main(String[] args) throws Exception {FileDemoCamel main = new FileDemoCamel();main.enableHangupSupport();main.addRouteBuilder(createRouteBuilder());main.bind("sampleGenerator", createDataSet());main.run(args);}static RouteBuilder createRouteBuilder() {return new RouteBuilder() {public void configure() {from("dataset://sampleGenerator").to("file://target/output");}};}static DataSet createDataSet() {return new SimpleDataSet();} }編譯并運行
mvn compile exec:java -Dexec.mainClass=camelcoredemo.FileDemoCamel完成后,您會看到在target/output文件夾中將生成10個文件,文件名的格式為ID-<hostname>-<unique-number>-<msg-seq-num> 。
您可以瀏覽“ 文件”組件中的更多選項。 嘗試一下路線 ,親自體驗一下。
翻譯自: https://www.javacodegeeks.com/2013/09/exploring-apache-camel-core-file-component.html
apache camel
總結
以上是生活随笔為你收集整理的apache camel_探索Apache Camel Core –文件组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用CUBA进行开发–是Spring的重
- 下一篇: 同人文是什么意思 同人文是指什么