探索Apache Camel Core –文件组件

文件轮询器是解决常见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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shiro 权限 URL 配置细节

转载于:https://www.cnblogs.com/hwgok/p/9100277.html

2016 年崛起的 JS 项目

本文是我对中文版 risingstars2016 的整理&#xff0c;而本人就是中文版的译者&#xff0c;首发于知乎专栏 前端周刊。共 21384 字&#xff0c;读完需 30 分钟&#xff0c;速读需 5 分钟。长江后浪推前浪&#xff0c;如果你能花 30 分钟读完我 6 个小时翻译的内容&#xff0c;相…

NPOI之Excel——设置单元格背景色

NPOI Excel 单元格颜色对照表&#xff0c;在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置&#xff0c;FillPattern 为单元格背景色的填充样式。NPOI Excel 单元格背景颜色设置方法&#xff1a; 123456ICellStyle style …

php 开启命令模式,如何启用PhpStorm中的命令行工具

本篇文章主要给大家介绍如何使用phpstorm中的命令行工具。PhpStorm下载地址&#xff1a;PhpStorm使用命令行工具&#xff0c;我们可以直接从IDE调用命令&#xff01;在我们使用任何命令行工具之前&#xff0c;我们必须在设置中启用它。涉及到的步骤如下&#xff1a;使用命令行工…

深入了解Java 8中的可选类API

作为Java程序员&#xff0c;我们所有人都经历了以下情况&#xff1a;我们调用一个方法来获取某个值&#xff0c;然后代替直接对返回值调用某些方法&#xff0c;我们首先必须检查返回值不为null&#xff0c;然后在返回值。 这是像Guava这样的外部API试图解决的难题 。 此外&…

CentOS7安装及配置vsftpd (FTP服务器)

CentOS7安装及配置vsftpd (FTP服务器) 1、安装vsftpd 1 yum -y install vsftpd 2、设置开机启动 1 systemctl enable vsftpd 3、启动ftp服务 1 systemctl start vsftpd.service 4、打开防火墙&#xff0c;开放21端口 1 firewall-cmd --zonepublic --add-port21/tcp --permanent…

React Native项目自动化打包发布

今天这篇文章的目的是在rn项目的构建&#xff0c;并不会涉及到rn框架或者使用的讲解&#xff0c;说起构建&#xff0c;特别是前端构建大家应该很快会想到webpack、Grunt、 Gulp等。而这些工具在rn项目中就显得有些鸡肋。所以在此给大家分享一下不使用构建工具实现rn项目自动化打…

Python程序员之面试必回习题

写在前面 近日恰逢学生毕业季&#xff0c;课程后期大家“期待苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分【临近毕业每天课前用40-60分钟对之前内容回顾、提问和补充&#xff0c;专挑班里不爱说话就的同学回答】。 期待的是可以检验自己学习的成功&#xff1b;苦逼的是…

如何用正则表达式杀死Java

我们最近偶然发现了一个我们绝对不了解的现象&#xff1a;您可以使用简单的正则表达式杀死任何Java IDE以及任何Java进程… 回到大学后&#xff0c;我被告知正则表达式&#xff08;称为正则语法或3型语法&#xff09;总是以有限状态的自动机结束&#xff0c;因此可以在线性时间…

php for next,Nextcloud停留无限登录页面 PHP7的问题及解决方案

Nextcloud 14或者15 无法打开登录界面出现错误信息如下&#xff1a;内部服务器错误服务器不能完成你的请求。如果再次发生&#xff0c;请在下方将技术详情发送给服务器管理员。更多细节可以在服务器日志中找到.技术细节远程地址: 210.22.126.186请求 ID: kSPvbdWDU7yvwng3516v请…

开发VUE使用第三库,发现有bug怎么办?

写在前面 本文只针对使用vue技术栈&#xff0c;进行讨论。 正文 使用vue技术栈开发&#xff0c;难免会使用第三库&#xff0c;这大大提高了我们开发的效率。然而&#xff0c;这是第三方库有bug怎么办&#xff1f; 既然有bug&#xff0c;就是现有功能没有达到预想效果。除了&a…

Java正则表达式中的反向引用

Java正则表达式中的反向引用是Java提供的另一个重要功能。 要了解反向引用 &#xff0c;我们首先需要了解群组 。 正则表达式中的分组意味着将多个字符视为一个单元。 通过将要分组的字符放在一组括号“&#xff08;&#xff09;”中来创建它们。 每组括号对应一个组 。 反向引…

SpringMVC原理MVC设计思想

什么是MVC&#xff1f; MVC是一种架构模式 --- 程序分层&#xff0c;分工合作&#xff0c;既相互独立&#xff0c;又协同工作 MVC是一种思考方式 --- 需要将什么信息展示给用户? 如何布局&#xff1f; 调用哪些业务逻辑&#xff1f; MVC流程图如下图所示&#xff1a; MVC核心思…

Hbase 的javaAPI基本操作用 在idea上的实现

1.保证集群开启&#xff1a; jps有如下进程 2.pom文件中的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sche…

用php求矩形周长,PHP实现的简单三角形、矩形周长面积计算器分享

运用php面向对象的知识设计一个图形计算器&#xff0c;同时也运用到了抽象类知识&#xff0c;这个计算器可以计算三角形的周长和面积以及矩形的周长和面积。本图形计算器有4个页面&#xff1a;1.php图形计算器主页index.php; 2.形状的抽象类shape.class.php; 3三角形计算…

ECMAScript Decorators---装饰器

ECMAScript Decorators---装饰器 Decorators是什么 Decorators可以改变类方法和类实例字段的属性和行为&#xff0c;使我们可以灵活地使用更简单的语法动态实现这些内容&#xff0c;是非侵入式的。---举例&#xff0c;你给手机添加一个外壳罢了&#xff0c;并不影响手机原有的…

php试卷A高质量含答案,php试卷A高质量含答案

《php试卷A高质量含答案》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《php试卷A高质量含答案(4页珍藏版)》请在金锄头文库上搜索。1、装订线得 分评卷人合肥滨湖职业技术学院17-18学年度第二学期PHP期末考试卷(A)班级&#xff1a; 学号&#xff1a; 姓名&#xff1…

旅行报告:JavaOne 2013 –重归荣耀

我已经回来几天了&#xff0c;需要赶上过去几天一直搁置的所有事情。 对我来说&#xff0c;这是一年中最忙的时间。 JavaOne和OpenWorld在旧金山的整整一周。 一个非常简短的旅行报告。 年度ACED简报 你们中许多人都知道我是Oracle社区认可计划&#xff08;称为“ ACE计划 ”&…

ElasticSearch 数据分片

一、ElasticSearch 分片 ElasticSearch集群中有许多个节点(Node)&#xff0c;每一个节点实例就是一个实例&#xff1b;数据分布在分片之间。集群的容量和性能主要取决于分片如何在节点上如何分配。将数据分片是为了提高可处理的容量和易于进行水平扩展&#xff0c;为分片做副本…

Unity3D_(游戏)2D坦克大战 像素版

2D坦克大战 像素版 游戏规则&#xff1a;  玩家通过上、下、左、右移动坦克&#xff0c;空格键发射子弹 敌人AI出身时朝向己方大本营(未防止游戏快速结束&#xff0c;心脏上方三个单位障碍物设为刚体)    当玩家被击杀次数>3  或  心脏被子弹击穿  重新加载游戏…