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

apache camel

文件轮询器是解决常见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将尝试为您转换文件。 骆驼使用上下文的注册表空间来预注册许多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

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

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

相关文章

java list 遍历 remove_JAVA中LISt遍历时如何remove元素?

import java。util。*;  public class object {  public static void main(String[] args) {  String str1 new String("abcde");  String str2 new String("abcde");  String str3 new String("abcde");  String str4 new Stri…

Java使用者的延期执行

在前面的博客文章&#xff08;“ 延迟执行Java的供应商 “&#xff09;&#xff0c;我引用礁HORSTMANN的陈述书中‘ 的Java SE8为真的很急关于lambda表达式’&#xff0c;‘所有的lambda表达式的点被推迟执行 。’ Horstmann在最后一年为Dobb博士的杂志写了一篇名为“ Java 8中…

java 代码造假_老板居然让我在Java项目中“造假”

1. 前言老板说&#xff0c;明天甲方要来看产品&#xff0c;你得造点数据&#xff0c;而且数据必须是“真”的&#xff0c;演示效果要好看一些&#xff0c;这样他才会买我们的产品&#xff0c;我好明年给你换个嫂子。一般开发接到这种过分要求都不会很乐意去做&#xff0c;这完全…

nginx php环境搭建_php+nginx环境配置

本篇文章的内容是PHP和nginx环境的配置&#xff0c;在这里分享给大家&#xff0c;也给有需要的朋友一个参考phpnginx环境配置1、首先需要准备的应用程序包。nginx&#xff1a;nginx/Windows-1.0.4php&#xff1a;php-5.2.16-nts-Win32-VC6-x86.zip (nginx下php是以FastCGI的方式…

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

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

php如何禁用浏览器的缓存,php如何禁止浏览器使用缓存页面

【摘要】PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言&#xff0c;与C语言类似&#xff0c;是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。下面是php如何禁止浏览器使用缓存页面&#xff0c;让我…

使用Java EE和OIDC构建Java REST API

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Java EE允许您使用JAX-RS和JPA快速轻松地构建Java REST API。 Java EE是保护伞标准规…

php 长微博程序,长微博生成工具PHP源码 根据文字生成长微博图片 - substr_count

&#xfeff;PHP substr_count() 函数定义和用法substr_count() 函数计算子串在字符串中出现的次数。语法substr_count(string,substring,start,length)...] rtrim($matches[3],\"/);//获取图片的id$parent_dir_num substr_count( $matches[3], ../);$relative_dirname …

php 加密类,php加密类

这篇文章的主要内容是介绍了关于php加密类 &#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下namespace app\index\controller;class Crypt{private $key "";public function __construct($key null){if (!is_null($…

通过JavaFX标注制作动画效果

在本文中&#xff0c;您将学习如何使用JavaFX的动画API创建标注。 您可以在https://www.youtube.com/watch?vXTHbB0LRdT4的 YouTube网站上查看这些标注的演示示例。 什么是标注&#xff1f; 我敢肯定&#xff0c;您已经看过广告或科幻电影&#xff0c;它们使用在图像顶部显示…

php 继承内核中的基类,继承类上的PHP new self()正在创建一个基类对象

参见英文答案 > New self vs. new static 3个我有一个充当基类的类.然后我有几个继承它的类.我想开始使用静态语法加载继承的类,但行为没有多大意义.直到现在我加载了这样的类,它完成了这项工作.$obj new foo();$something $obj->B…

使用trackBy启动流程

仍然沿用Corda Services的趋势&#xff0c;我还有其他一些技巧可帮助您的CorDapp顺利工作。 这次&#xff0c;我们将重点关注使用trackBy从服务内部启动流以及如果您不小心可能会引起的离散问题。 这应该是一个相对简短的职位&#xff0c;因为我可以依靠之前的职位&#xff1a…

过防火墙一句话php2017,dedeCMS友情链接getshell漏洞利用

1.php//print_r($_SERVER);$referer $_SERVER[HTTP_REFERER];$dede_login str_replace("friendlink_main.php","",$referer);//去掉friendlink_main.php&#xff0c;取得dede后台的路径//拼接 exp$muma .;$exp tpl.php?actionsavetagfile&actiond…

java 1.8新增功能_Java 8的新增功能(第二部分-可能会出现什么)

java 1.8新增功能免责声明&#xff1a;我不为Oracle工作&#xff0c;也不以任何方式代表Oracle。 此功能列表不是官方的。 作为“局外人”&#xff0c;这只是我研究的一部分。 这是由三部分组成的系列文章的第二部分。 在第一部分中 &#xff0c;我谈到了Oracle正式让开发人员…

Spring应用架构

我最近收到我博客的一位读者Ajay的问题&#xff0c;并决定在此处分享我的答案&#xff0c;以帮助其他有类似问题的人。 这是来自阿杰的问题&#xff1a; 大卫您好&#xff0c;我想知道我最近遇到的两种MVC应用程序体系结构之间的区别&#xff1a; 1&#xff09;在普通的Spri…

PHP能不能让一串代码现实,一段让你认清现实的Java代码.java

/*** 答致命三问* 终回归现实*/public static void main(String[] args) {boolean a false,b false,c false;java.util.Scanner scanner new java.util.Scanner(System.in);System.out.println(decode("5oKo5aSa6auY77yIY23vvInvvJ8"));int height 0;while (hei…

java+springmvc+vo,springmvc+mybatis的实例详解

前面讲到&#xff1a;SpringSpringMVCMyBatis深入学习及搭建(十三)——SpringMVC入门程序(二)1.需求使用springmvc和mybatis完成商品列表查询。2.整合思路springmvcmybatis的系统架构&#xff1a;第一步&#xff1a;整合dao层mybatis和spring整合&#xff0c;通过spring管理map…

java是面向过程的编程语言吗,下列关于Java语言特点的叙述中,错误的是()。 A.Java是面向过程的编程语言B.Java支持分...

查询最近30天的记录应使用( )作为准则某企业年度主营业务收入为以下关于第一层ISP特征的描述中,错误的是测量电压时&#xff0c;应将数字万用表与被测电路并联。()HLAⅡ类分子主要分布于在铁碳合金相图中今年来,公务员逐渐成为广大高校毕业生所青睐的热门职业,但是报考公务员必…

了解为什么这个直观的工具是您团队的通用团队管理工具

每个项目管理工具都试图做同样的工具性工作&#xff1a;保持团队联系&#xff0c;按任务执行和按时完成重大计划。 但是市场变得非常拥挤&#xff0c;并且有充分的理由-没有平台似乎对人们需要看的东西以及应该如何显示这些信息具有正确的感觉&#xff0c;以便它们既可行又相关…

ecshop 模板 php代码,ecshop无法在模板文件.dwt和.lbi中直接添加php代码的解决方法...

ecshop不能在模板文件.dwt和.lbi中直接添加php代码了&#xff0c;为什么呢&#xff1f;因为直接在模板中加入php函数和代码&#xff0c;没有经过过滤&#xff0c;容易造成安全隐患。程序源码安全是比较重要的。不过如果有朋友希望能在模板文件中直接加入.dwt和.lbi文件&#xf…