简单文件复制的正确 Java 配置是什么

2024-03-07

我对 Spring 非常陌生,对 Spring Integration 更陌生,所以如果这是一个非常基本的问题,我深表歉意。

我想构建一个非常基本的日志文件处理器来学习诀窍。与此非常相似:example http://forum.spring.io/forum/spring-projects/integration/94764-file-channel-adapter-issues

我还想使用 java 配置方法,并且我所遵循的大多数示例都是 XML 驱动的,并且我在进行翻译时遇到了困难。

最终,我想递归地轮询日志文件的源目录,并使用持久性存储来跟踪发现的内容。

然后,将要处理的文件复制到处理文件夹中,然后启动 Spring 批处理作业来处理文件的内容。

当一切完成后,可以从处理位置删除已处理的文件。

我似乎无法找出连接流程的正确方法(使用 SpEL 的通用 java 配置)。另外,我仍然非常不确定正确的部分应该是什么。

再次遵循这些基本的、高级的文件移动路线:

file:inbound-channel-adapter -> channel -> file:outbound-adapter

基本样本 https://github.com/spring-projects/spring-integration-samples/tree/master/basic/file

这是我到目前为止所拥有的

EDIT

我已经更新了 Artem 的解决方案。我的源文件现在已正确复制到目标位置。谢谢阿尔乔姆!

最终我仍然面临着同样的问题。立即找到要扫描的文件(并且立即填充metadata-store.properties 文件),但文件会缓慢复制到目标文件夹。如果发生崩溃,任何尚未复制到目标文件夹的源文件基本上都会“丢失”。也许我需要查看其他形式的持久性存储,例如自定义 jdbcfilter。

@Value("${logProcessor.filenamePattern}")
private String filenamePattern;

@Value("${logProcessor.sourceDirectory}")
private String sourceDirectory;

@Value("${logProcessor.processingDirectory}")
private String processingDirectory;

@Bean
@InboundChannelAdapter(channel = "sourceFileChannel", poller = @Poller(fixedRate = "5000"))
public MessageSource<File> sourceFiles() {

        CompositeFileListFilter<File> filters = new CompositeFileListFilter<>();
        filters.addFilter(new SimplePatternFileListFilter(filenamePattern));
        filters.addFilter(persistentFilter());

        FileReadingMessageSource source = new FileReadingMessageSource();
        source.setAutoCreateDirectory(true);
        source.setDirectory(new File(sourceDirectory));
        source.setFilter(filters);
        source.setUseWatchService(true);

        return source;
    }

@Bean
@InboundChannelAdapter(channel = "processingFileChannel", poller = @Poller(fixedRate = "5000"))
    public MessageSource<File> processingFiles() {

        CompositeFileListFilter<File> filters = new CompositeFileListFilter<>();
        filters.addFilter(new SimplePatternFileListFilter(filenamePattern));

        FileReadingMessageSource source = new FileReadingMessageSource();
        source.setAutoCreateDirectory(true);
        source.setDirectory(new File(processingDirectory));
        source.setFilter(filters);

        return source;
    }

@Bean
@ServiceActivator(inputChannel = "sourceFileChannel")
public MessageHandler fileOutboundChannelAdapter() {
    FileWritingMessageHandler adapter = new FileWritingMessageHandler(new File(processingDirectory));
    adapter.setDeleteSourceFiles(false);
    adapter.setAutoCreateDirectory(true);
    adapter.setExpectReply(false);
    return adapter;
}


    @Bean
    public MessageChannel sourceFileChannel() {
        return new DirectChannel();
    }

    @Bean
    public MessageChannel processingFileChannel() {
        return new DirectChannel();
    }

    @Bean
    public DefaultDirectoryScanner defaultDirectoryScanner() {
        return new DefaultDirectoryScanner();
    }

    @Bean
    public FileSystemPersistentAcceptOnceFileListFilter persistentFilter() {
        FileSystemPersistentAcceptOnceFileListFilter fileSystemPersistentAcceptOnceFileListFilter = new FileSystemPersistentAcceptOnceFileListFilter(metadataStore(), "");
        fileSystemPersistentAcceptOnceFileListFilter.setFlushOnUpdate(true);
        return fileSystemPersistentAcceptOnceFileListFilter;
    }

    @Bean
    public PropertiesPersistingMetadataStore metadataStore(){
        PropertiesPersistingMetadataStore metadataStore = new PropertiesPersistingMetadataStore();
        metadataStore.setBaseDirectory("C:\\root\\code\\logProcessor");
        return metadataStore;
    }

到目前为止你的配置很好。

面对如此复杂的任务,我不知道如何帮助你。

你应该问更具体的问题。我们无法为您编写解决方案。

不确定为什么需要将文件从一个目录复制到另一个目录,如果您可以简单地从源目录轮询它们,将其存储在metadataStore并开始文件处理。

到目前为止,我在您的配置中发现了一个小问题。这FileWritingMessageHandler将结果发送到processingFileChannel第二个也做了同样的事情FileReadingMessageSource。我不确定这是不是你的意图。以防万一引起您的注意。

您可能还需要了解FileSplitter http://docs.spring.io/spring-integration/reference/html/files.html#file-splitter,它允许您逐行处理文件。

你还说processingDirectory,但是然后你使用tmpDir为了FileWritingMessageHandler,我猜,它假设了你的复制逻辑。

让我们一步步完成任务吧!然后您就知道使用什么、在哪里以及如何使用!

EDIT

如果您只需将文件复制到processingDirectory如果没有任何回复,您应该进行单向适配器:

@Bean
@ServiceActivator(inputChannel = "sourceFileChannel")
public MessageHandler fileOutboundChannelAdapter() {
    FileWritingMessageHandler adapter = new FileWritingMessageHandler(new File(processingDirectory));
    adapter.setDeleteSourceFiles(true);
    adapter.setAutoCreateDirectory(true);
    adapter.setExpectReply(false);
    return adapter;
}

然后你的@InboundChannelAdapter(channel = "processingFileChannel"很适合拾取文件进行处理。

不确定您是否需要DeleteSourceFiles尽管...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单文件复制的正确 Java 配置是什么 的相关文章

随机推荐

  • 在 JavaScript 中提升变量

    据我了解 变量提升是在 Java 脚本中完成的 我无法理解为什么它输出为未定义 do something var foo 2 console log foo do something it prints 2 do something con
  • MVC 5 Bootstrap 模式不起作用

    我仍处于 MVC 学习模式 我需要的一件事是删除确认模式 我想使用 Bootstrap 来做到这一点 我四处搜索并想出了一些例子 我已经看过几次了 但我似乎无法让它发挥作用 我确保已下载最新版本的 Bootstap v3 3 5 并将其保存
  • 根据 SDK 级别忽略 Android 单元测试

    是否有注释或其他方便的方法来忽略特定 Android SDK 版本的 junit 测试 有没有类似Lint注解TargetApi x 的东西 或者我是否必须手动检查是否使用 Build VERSION 运行测试 我认为还没有准备好 但为此创
  • 如何使用 DispatchGroup 在 for 循环内进行异步调用

    在下面的示例代码中 我调用complete false 失败时 但是 由于我使用的是DispatchGroup对象来确保所有异步请求都完成 我不能只调用syncGroup leave 失败时 作为notify将被调用 其中包含complet
  • WooCommerce:获取并设置送货和帐单地址的邮政编码

    如何在 woocommerce 中设置 获取邮政编码 Zip code 有这个功能吗 即 我可以通过任何函数设置邮政编码吗 我还想知道 如果用户未登录 如何用我的数据 例如 546621 填充此字段 您可以执行以下操作来获取 设置帐单 运输
  • 带光标的可扩展列表视图

    我想制作一个可扩展的列表视图 但适配器将光标作为输入而不是数组列表 我想在崩溃时实现动画 https github com idunnololz AnimatedExpandableListView https github com idu
  • 是否可以禁用 cdkDrag 子元素上的拖动?

    我正在使用 Angular Material 中的 Angular CDK 拖放 请参阅文档here https material angular io cdk drag drop overview 我想知道是否有可能禁用在子元素上拖动cd
  • Django Rest框架-无法序列化查询集

    我尝试序列化查询集 def do self reservations Reservation objects all serializer ReservationSerializer data reservations many True
  • golang 类型映射的匿名字段

    我想我可以通过使用匿名字段来创建有序的地图类型 type customMap struct map string string ordered string 我可以在哪里参考地图customMapInstance key 并迭代ordere
  • Docker-swarm >> 无法连接到 docker 引擎端点

    docker version 1 9 1 swarm version 1 0 1 为什么要将 3 个虚拟机 桥接网络 连接到 swarm docker info 显示所有节点 状态待定 3 个主机中的 1 个是manager所有输出均来自该
  • 确定 JavaScript 属性是否定义了 getter 或 setter?

    给定一个对象和属性名称 是否可以确定该属性是使用 getter 还是 setter 定义的 还是完全透明的 如果属性上尚未定义 getter setter 我只想定义一个 getter setter 我需要它在 WebKit Firefox
  • Git init --bare - 不在工作树上工作

    我正在按照这里的例子http wiki dreamhost com Git http wiki dreamhost com Git 基本上我想创建一个 git 存储库 我可以从桌面推送到服务器上 在主机上 host mkdir projec
  • UILocalNotification:播放保存在文档目录中的自定义音频文件

    目前我正在创建一个警报应用程序 它可以从服务器播放自定义音频剪辑 我的实现计划是在本地保存所有音频剪辑 然后相应地设置 soundName 但我有一些问题 目前 我在将音频文件保存在捆绑目录中时遇到问题 只能将文件保存在文档目录中 是否可以
  • 相当于ORACLE在mysql中的并行查询

    mysql中有没有与ORACLE相同的并行查询的等效方法 甲骨文之道 select FULL emp PARALLEL emp 35 emp name from emp 在mysql中 完整 emp 并行 emp 35 将被视为评论 MyS
  • 在 Java 中嵌入 XQuery

    我需要从 Java 中的 MusicXML xml 文件中检索一些详细信息 我设法用java读取xml文件 但通过网络服务 当我运行代码时我必须在线 连接到互联网 我遇到了 XQuery 您可以轻松地从 XML 文件中提取信息 但我需要在j
  • GNU 制定通配符替代方案吗?

    我想选择目录中的所有文件 但使用 FreeBSD 的 make 在 GNU 中 使这种方法有效 FILES wildcard c 我使用的是 FreeBSD 的 make 而不是 GNU make 所以我正在寻找可以在 FreeBSD 的
  • 从 DOM 中删除同级元素时创建块元素的平滑过渡

    我有一个容器 其工作方式类似于 mac os 中的通知 元素被添加到队列中 并在一定的超时后被删除 这很有效 但有一个不和谐的视觉副作用 当它们从 DOM 中删除时 UI 会出现锯齿状更新 因为堆栈中的下一个元素会填充前一个元素创建的空白
  • Web API Swagger 文档导出为 PDF

    根据文档 http swagger io open source integrations http swagger io open source integrations 有插件Java to 将 Swagger 文档导出为 PDF 我只
  • 如何在组件中查找元素?

    我想知道如何使用以下命令找到组件内的元素Renderer 在 angular1 中我会去 link scope element attributes gt var outsideBox element find outside box 这返
  • 简单文件复制的正确 Java 配置是什么

    我对 Spring 非常陌生 对 Spring Integration 更陌生 所以如果这是一个非常基本的问题 我深表歉意 我想构建一个非常基本的日志文件处理器来学习诀窍 与此非常相似 example http forum spring i