文件轮询器是解决常见IT问题的非常有用的机制。 Camel的内置file组件非常灵活,并且有许多选项可用于配置。 让我们在这里介绍一些常用用法。

轮询输入文件的目录

这是典型的骆驼Route用于每秒轮询一次目录以查找输入文件。

import org.slf4j.*;
import org.apache.camel.*;
import org.apache.camel.builder.*;
import java.io.*;public class FileRouteBuilder extends RouteBuilder {static Logger LOG = LoggerFactory.getLogger(FileRouteBuilder.class);public void configure() {from("file://target/input?delay=1000").process(new Processor() {public void process(Exchange msg) {File file = msg.getIn().getBody(File.class);LOG.info("Processing file: " + file);}});}
}

使用以下命令运行

mvn compile exec:java -Dexec.mainClass=org.apache.camel.main.Main -Dexec.args='-r camelcoredemo.FileRouteBuilder'

该程序将开始轮询当前目录下的target/input文件夹,并等待传入​​文件。 要测试输入文件,您需要打开另一个终端,然后按照以下步骤创建一些文件。

echo 'Hello 1' > target/input/test1.txt
echo 'Hello 2' > target/input/test2.txt

现在,您应该看到第一个提示窗口开始拾取文件并传递到下一个Processor步骤。 在Processor ,我们从消息正文中获取File对象。 然后,它仅记录它的文件名。 完成后,您可以按CTRL+C

您可以在URL中使用file组件中的许多可配置选项,但是大多数默认设置足以使您如上所述。 其中一些默认行为是,如果输入文件夹不存在,它将创建它。 当文件由Route完成处理后,它将被移入.camel文件夹。 如果在处理后根本不需要文件,则在URL中设置delete=true

读入文件内容并转换为不同类型

默认情况下, file组件将为找到的每个文件创建一个org.apache.camel.component.file.GenericFile对象,并将其作为消息正文传递给Route 。 您可以通过此对象检索所有文件信息。 或者,您也可以使用Exchange API将邮件正文对象自动转换为希望接收的类型(例如:与msg.getIn().getBody(File.class) )。 在上面的示例中, File是您希望从消息正文中获取的类型,因此Camel将尝试为您转换文件。 Camel使用上下文的注册表空间预先注册了许多TypeConverter ,它们可以处理大多数常见数据类型(例如Java primitive等)的转换。 这些TypeConverter s为强大的方式来让你的RouteProcessor更flexbile和便携。

Camel不仅可以从邮件正文转换您的File对象,还可以读取文件内容。 如果您的文件基于字符文本,则只需执行此操作。

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);}});

要将输入文件正确地馈入轮询文件夹,最好是发件人首先在一个临时文件夹中生成输入文件,然后只有在准备好之后才将其移入轮询文件夹。 如果输入文件可能需要花费一些时间来生成,这将最大程度地减少通过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删除。 这种解决方案将使发送者可以花费很长时间生成输入文件。

大文件处理的另一个问题是避免将整个文件内容加载到内存中进行处理。 为了更实际,您想将文件拆分为记录(例如:每行)并一一处理(或称为“流”)。 这就是您使用骆驼的方法。

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并发送到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>

您可以浏览“ 文件”组件中的更多选项。 尝试一下路线 ,亲自体验一下。

参考:在A Programmer's Journal博客上,我们JCG合作伙伴 Zemian Deng 探索Apache Camel Core –文件组件 。

翻译自: https://www.javacodegeeks.com/2013/09/exploring-apache-camel-core-file-component.html

探索Apache Camel Core –文件组件相关推荐

  1. apache camel_探索Apache Camel Core –文件组件

    apache camel 文件轮询器是解决常见IT问题的非常有用的机制. Camel的内置file组件非常灵活,并且有许多选项可用于配置. 让我们在这里介绍一些常用用法. 轮询目录以输入文件 这是一条 ...

  2. camel seda 协议_探索Apache Camel Core – Seda组件

    camel seda 协议 Apache Camel中的seda组件与我在先前的博客中介绍的direct组件非常相似,但是以异步的方式. 为此,它使用java.util.concurrent.Bloc ...

  3. 探索Apache Camel Core – Seda组件

    Apache Camel中的seda组件与我在之前的博客中介绍的direct组件非常相似,但是以异步的方式. 为此,它使用java.util.concurrent.BlockingQueue作为默认实 ...

  4. apache camel_在WildFly中将Apache Camel和Spring添加为jboss模块

    apache camel 这些天,我在玩Wildfly , Apache Camel和Spring . 在EAR / WAR之间进行通信的一种简单方法是使用Camel的direct-vm组件. 有或没 ...

  5. 在WildFly中将Apache Camel和Spring添加为jboss模块

    这些天,我在玩Wildfly , Apache Camel和Spring . 在EAR / WAR之间进行通信的一种简单方法是使用Camel的direct-vm组件. 有或没有骆驼,有很多方法可以实现 ...

  6. Apache Camel - 25 - CXF - WebService(Code First)

    本篇文章对应的完整项目源码地址: 15-ApacheCamel-CXF-Demo-Server(Code First) 16-ApacheCamel-CXF-Demo _16-ApacheCamel- ...

  7. Apache Camel源码研究之Rest

    本文以Camel2.24.3 + SpringBoot2.x 为基础简单解读Camel中的Rest组件的源码级实现逻辑. 0. 目录 1. 前言 2. 源码解读 2.1 启动时 2.1.1 `Rest ...

  8. Apache Camel日志组件示例

    Apache Camel日志组件示例 您要将消息记录到底层的记录机制,请使用骆驼的log:组件. Camel使用sfl4j作为记录器API,然后允许您配置记录器实现. 在本文中,我们将使用Log4j作 ...

  9. 适用于ActiveMQ 5.9的Apache Camel Broker组件

    将Apache Camel嵌入ActiveMQ代理可以为使用Camel的集成功能扩展消息代理提供极大的灵活性. Apache Camel路由的另一个好处是,如果使用activemq组件 ,则可以避免远 ...

最新文章

  1. 正则表达式(括号)、[中括号]、{大括号}的区别小结
  2. otsu阈值分割算法_图像分割之大津算法(OTSU)
  3. 浅析企业建站都需要了解哪些基础内容?
  4. 用python画图代码简单-【Matplotlib】利用Python进行绘图
  5. Linux 性能分析大概步骤
  6. (转)Java中equals和==、hashcode的区别
  7. java实现儿时的超级玛丽游戏
  8. 虚拟化技术--桌面虚拟化(VDI)
  9. js this指向分析
  10. php 中c函数重载,php函数重载的替代方法--伪重载详解
  11. visualvm远程监控jvm_别再说你不会 JVM 性能监控和调优了,看完这篇再发言
  12. 3S基础知识:MapInfo应用MapX编程实现地图数据查询
  13. Keep your Eyes on the Lane: Real-time Attention-guided Lane Detection
  14. 2019已经很冷,2020年Android工作或更难找——进大厂面试必备基础技能
  15. windows7到底是多用户多任务操作系统还是单用户多任务操作系统
  16. C语言:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字
  17. Python科学计算库(Numpy)基础篇(IDE为Pycharm)- 数组数值计算
  18. nacos启动报错解决方法
  19. SpringBoot集成JWT实现Token登录验证
  20. mysql主从同步故障_MySQL主从同步故障

热门文章

  1. SecureCRT连接Linux的操作步骤
  2. (转)threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别
  3. eclipse创建神经网络_使用Eclipse Deeplearning4j构建简单的神经网络
  4. eclipse中ast_JavaParser中AST节点的观察者
  5. java jinq_将JINQ与JPA和H2一起使用
  6. java不可变类型_Java中的值类型:为什么它们不可变?
  7. maven项目 jetty_如何使用Java,Maven,Jetty创建Web应用程序项目
  8. NoSQL数据库程序员应该在2019年学习的5大知识
  9. 创新设计模式:原型模式
  10. Java命令行界面(第27部分):cli-parser