Spring Integration –轮询文件的创建和修改

1引言

文件支持是Spring Integration与外部系统通信的另一个端点。 在这种情况下,它提供了几个组件来读取,写入和转换文件。 在这篇文章中,我们将编写一个监视目录的应用程序,以便读取其中的所有文件。 具体而言,它执行以下操作:

  • 当应用程序启动时,它将读取目录中存在的所有文件。
  • 然后,应用程序将密切注意目录以检测新文件和已修改的现有文件。

可以在Github中找到源代码。

2配置

该应用程序是使用Spring Boot构建的,因为它大大简化了配置。 要创建应用程序的初始基础结构,您可以转到https://start.spring.io/ ,选择Integration模块并生成项目。 然后,您可以在自己喜欢的IDE中打开zip文件。

我在pom.xml中添加了一些依赖项,例如commons.io或Spring Integration Java DSL。 我的pom.xml文件如下所示:

<?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:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>xpadro.spring.integration</groupId><artifactId>file-read-directory</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>file-read-directory</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.3.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Spring Integration - Java DSL --><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-java-dsl</artifactId><version>1.0.0.RELEASE</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.5</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

起点是FileReadDirectoryApplication:

@SpringBootApplication
public class FileReadDirectoryApplication {public static void main(String[] args) throws IOException, InterruptedException {SpringApplication.run(FileReadDirectoryApplication.class, args);}
}

从这里开始,我们将添加Spring Integration组件以从文件系统的特定文件夹中读取。

3添加适配器

为了从文件系统读取,我们需要一个入站通道适配器。 适配器是一个文件读取消息源,它负责轮询文件系统目录中的文件,并从找到的每个文件中创建一条消息。

@Bean
@InboundChannelAdapter(value = "fileInputChannel", poller = @Poller(fixedDelay = "1000"))
public MessageSource<File> fileReadingMessageSource() {CompositeFileListFilter<File> filters = new CompositeFileListFilter<>();filters.addFilter(new SimplePatternFileListFilter("*.txt"));filters.addFilter(new LastModifiedFileFilter());FileReadingMessageSource source = new FileReadingMessageSource();source.setAutoCreateDirectory(true);source.setDirectory(new File(DIRECTORY));source.setFilter(filters);return source;
}

我们可以通过为消息源设置过滤器列表来防止某些类型的文件被轮询。 对于此示例,已包含两个过滤器:

  • SimplePatternFileListFilter :Spring提供的过滤器。 仅具有指定扩展名的文件将被轮询。 在这种情况下,将仅接受文本文件。
  • LastModifiedFileFilter :自定义过滤器。 该过滤器跟踪已轮询的文件,并将过滤自上次跟踪以来未修改的文件。

4处理文件

对于每个轮询的文件,我们将其内容转换为String,然后再将其传递给处理器。 为此,Spring已经提供了一个组件:

@Bean
public FileToStringTransformer fileToStringTransformer() {return new FileToStringTransformer();
}

因此,处理器将收到Message <String>,而不是接收Message <File>。 文件处理器是我们的自定义组件,它将执行与打印文件内容一样高级的操作:

public class FileProcessor {private static final String HEADER_FILE_NAME = "file_name";private static final String MSG = "%s received. Content: %s";public void process(Message<String> msg) {String fileName = (String) msg.getHeaders().get(HEADER_FILE_NAME);String content = msg.getPayload();System.out.println(String.format(MSG, fileName, content));}
}

5建立流程

现在我们已经准备好所有必需的组件,让我们构建流程。 我们正在使用Spring Integration Java DSL,因为它使流程更具可读性:

@Bean
public IntegrationFlow processFileFlow() {return IntegrationFlows.from("fileInputChannel").transform(fileToStringTransformer()).handle("fileProcessor", "process").get();}@Beanpublic MessageChannel fileInputChannel() {return new DirectChannel();}

6运行应用程序

在我的目录中,我已经有一个名为“ previousFile.txt”的文件。 启动应用程序后,我们将创建两个文件并修改其中一个。

public static void main(String[] args) throws IOException, InterruptedException {SpringApplication.run(FileReadDirectoryApplication.class, args);createFiles();
}private static void createFiles() throws IOException, InterruptedException {createFile("file1.txt", "content");createFile("file2.txt", "another file");appendFile("file1.txt", " modified");
}

如果运行该应用程序,则应该看到以下打印语句:

previousFile.txt received. Content: previous content
file1.txt received. Content: content
file2.txt received. Content: another file
file1.txt received. Content: content modified

7结论

这个例子展示了使用Spring Integration从目录中读取文件非常简单,显然是借助Spring Boot来简化配置。 根据您的需要,您可以将自己的自定义过滤器添加到消息源,或者使用Spring提供的另一个过滤器,例如RegexPatternFileListFilter 。 您可以在此处检查其他实现。

如果您发现此帖子有用,请分享或给我的存储库加注星标:)

我正在Google Plus和Twitter上发布我的新帖子。 如果您要更新新内容,请关注我。

翻译自: https://www.javacodegeeks.com/2016/07/spring-integration-polling-file-creation-modification.html

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

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

相关文章

为什么需要消息队列MQ

主要原因&#xff1a;是在高并发情况下&#xff0c;由于来不及同步处理&#xff0c;请求往往会发生堵塞&#xff0c;比如诸多的insert、update之类的请求同时到达mysql&#xff0c;直接导致无数的行锁表锁&#xff0c;甚至最后请求会堆积很多&#xff0c;从而触发大量的too man…

数据库连接池的使用

关于数据库连接池的使用&#xff0c;首先我们要明白我们为什么要用它&#xff0c;对应普通的数据库连接操作&#xff0c;通常会涉及到以下一些操作是比较耗时的&#xff1a; 网络通讯&#xff0c;涉及到网络延时及协议通讯身份验证&#xff0c;涉及安全性检查连接合法性检查&a…

mysql基础知识整理_MYSQL基础知识整理

目录1、客户端命令2、服务器端命令3、常用数据类型3.1、数值型3.2、字符型3.3、日期时间型3.4、布尔型4、mysql的执行方式5、用户管理1、客户端命令客户端命令不需要以分号结尾 &#xff0c;如果想获取客户端命令的帮助信息则&#xff1a;mysql> helpmysql常用客户端命令如下…

python 学习DAY11

动态传参 形参* # 聚合所有位置参数的实参 实参* #打散一个位置参数成多个 形参** #聚合所有关键词参数 实参** #打散实参的关键词参数 命名空间 第一种 内置名称空间 第二种 全局名称空间 第三中 局部名臣空间 作用域 全局作用域(是内置的,全局也可以调用) 局部作用域(局部可调…

【网络技术设备安全】BGP 基础与概述-2-中转 AS 中的 IBGP 路由传递

0x01 中转 AS 中的 IBGP 路由传递 参考该图&#xff1a; 上图&#xff0c;我们模拟一个 1.0 的路由通过 AS 65101 来传递 1&#xff1a;通过图可知&#xff0c;A 与 B 之间的 Peer 为 EBGP&#xff0c;B 与 E 之间为 Peer IBGP&#xff0c;E 与 F 之间为 Peer EBGP 邻接 2&a…

python函数变量的作用域_学不会的Python函数——变量作用域

1. LEGB函数Python中&#xff0c;程序的变量并不是在哪个位置都可以访问的&#xff0c;访问权限决定于这个变量是在哪里赋值的。我们先来看一段代码。上述代码有两个变量a&#xff0c;当在test函数中输出变量a的值是&#xff0c;为什么输出的是20&#xff0c;而不是10呢&#x…

浅谈JSP表单中的form传值

不同JSP页面之间、不同action之间,以及JSP中form与其对应的action之间,JSP中form与其不对应的action之间如何传值。本文将介绍JSP表单中的form传值。 JSP表单中的form传值 页面间链接和数据传递的三种方式 &#xff08;1&#xff09;通过JSP表单form将数据提交到下一个页面&…

react.js从入门到精通(一)

web端三大框架react、vue和angular&#xff0c;下面是对react.js的一些总结。 一、环境搭建 1、npm搭建项目 推荐使用npm搭建项目环境&#xff0c;如果网速过慢&#xff0c;可是使用cnpm进行项目的搭建&#xff08;cnpm是淘宝的npm镜像&#xff0c;与npm有些差异&#xff0c;有…

java 代码冲突检测_Java中常见的代码冲突

java 代码冲突检测在工作中&#xff0c;最近我对现有Java项目进行了代码清理。 完成该练习后&#xff0c;我可以看到在代码中一次又一次地发生了一组常见的代码冲突。 因此&#xff0c;我想出了此类常见违规的清单&#xff0c;并与同行共享&#xff0c;以提高安全意识&#xff…

ubuntu 编译mysql_Ubuntu编译MySQL5

编译MySQL5源码提示 No curses/termcap library found&#xff0c;但安装curses termcap都提示已经安装。编译时加上路径即可解决&#xff0c;即./conf编译MySQL5源码提示 No curses/termcap library found&#xff0c;但安装curses termcap都提示已经安装。编译时加上路径即可…

WIN7下搭建FTP

步骤如下&#xff1a; 一、 二、 三、 四、 五、 六、 七、 八、 九、检验 注意&#xff1a;只有本机可以访问ftp&#xff0c;外部电脑无法访问ftp&#xff1f;可能是防火墙未关闭。

Android调用系统拍照裁剪和选图功能

最近项目中用到修改用户头像的功能,基本上都是模板代码,现在简单记录一下. 调用系统拍照private fun openCamera() { //调用相机拍照// 创建File对象&#xff0c;用于存储拍照后的图片var outputImage File(externalCacheDir, "output_image.jpg")try {if (outputI…

忘记番石榴:5个Google库Java开发人员应该知道的

什么是最有用但未知的Google Java库&#xff1f; 如果我们在激烈的黑客马拉松中阻止某人并要求她命名一个受欢迎的Google Java库&#xff0c;那么答案可能就是Guava。 这也就不足为奇了&#xff0c;因为它的主要重点是提高开发人员的生产力。 但是其他Google图书馆呢&#xff…

VS在win32平台与mysql链接_mysql5.5.28-win32 + qt--4.8.2-vs2008 数据库驱动编译与连接...

我们来编译配置qt的mysql数据库驱动&#xff0c;首先看看官方文档的说明&#xff0c;如下How to Build the QMYSQL Plugin on WindowsYou need to get the MySQL installation files.RunSETUP.EXEand choose "Custom Install".Install the "Libs & Include …

JAVA知识学习——类的修饰符

Java程序在定义类时&#xff0c;除了使用class关键字标识之外&#xff0c;还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性。类的修饰符分为访问控制符和非访问控制符两大类。修饰符之间的先后排列次序对类的性质没有任何影响。一&#xff0c;非访问修饰符。 1…

神秘的数组初始化_I / O神秘化

神秘的数组初始化由于对高度可扩展的服务器设计的所有炒作以及对Node.js的狂热&#xff0c;我一直想重点研究IO设计模式&#xff0c;直到现在为止都没有足够的时间进行投资。 现在已经做了一些研究&#xff0c;我认为最好记下我遇到的东西&#xff0c;作为对我以及可能遇到这篇…

mysql characteristic_MySQL存储过程定义中的特性(characteristic)的含义

MySQL的存储过程蛮啰嗦的&#xff0c;与MSSQL或者Oracle的存储过程相比&#xff0c;如果没有显式指定&#xff0c;他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程通常在使用图形界面工具进行存储过程编写的时候&#xff0c;图形界面工具会自动加上这部分内容…

hive 案例分析

转自 http://www.cnblogs.com/guanhao/p/5641675.html 1. 创建数据库&#xff0c;切换数据库 create database testdb2; use testdb2; 2. 创建管理表 create table emp( empno int, empname string, job string, mgr int, hiredate string, salary double, comm double, deptn…

BeanUtils包的使用

BeanUtils工具包是由Apache公司所开发&#xff0c;主要是方便程序员对Bean类能够进行简便的操作。 在使用BeanUtils工具包之前我们需要的Jar包有以下几种&#xff1a; (1) BeanUtils相关包 commons-beanutils-1.8.3.jar commons-beanutils-1.8.3-javadoc.jar commons-beanuti…

使用JMX作为Ganglia的现代替代品进行CLDB监视

有许多选项可用于监视MapR集群的性能和运行状况。 在本文中&#xff0c;我将介绍使用Java管理扩展&#xff08;JMX&#xff09;监视CLDB的鲜为人知的方法。 据最受尊敬的MapR数据工程师之一&#xff0c;Akihiko Kusanagi称&#xff0c;与使用Ganglia相比&#xff0c;使用JMX来…