我们有一个 Java 应用程序,它每隔 30 分钟从客户端 FTP 轮询文件,然后扫描所有文件,查看所有文件与应用程序内部配置的模式匹配,并根据该模式相应地处理文件。这里的问题是我们必须每 30 分钟进行一次线性扫描,这花费了太多时间。由于我们不想处理重复的文件,所以我们在最后维护文件的哈希码,然后我们检查哈希码是否与现有的哈希码匹配。由于权限,无法删除已处理的文件。在此处需要有关如何优化此功能的帮助。
我们使用 SSHJ 库进行 SFTP 通信。
我们有一个 Java 应用程序,它每隔 30 分钟从客户端 FTP 轮询文件,然后扫描所有文件,查看所有文件与应用程序内部配置的模式匹配,并根据该模式相应地处理文件。这里的问题是我们必须每 30 分钟进行一次线性扫描,这花费了太多时间。由于我们不想处理重复的文件,所以我们在最后维护文件的哈希码,然后我们检查哈希码是否与现有的哈希码匹配。由于权限,无法删除已处理的文件。在此处需要有关如何优化此功能的帮助。
我们使用 SSHJ 库进行 SFTP 通信。
您无法将客户端的哈希码与服务器端文件的哈希码进行比较(因为您必须下载文件)。
你可以做的是:在服务器上执行 ls 命令,获取 fileinfo(日期、大小、名称、isDir)信息。使用它作为哈希码进行比较。跳过那些哈希码已经存在的人。
为什么不使用 SFTP 入站通道适配器并将其与SftpPersistentAcceptOnceFileListFilter结合使用?这将跟踪已经下载的文件,而不是下载两次。
<int-sftp:inbound-channel-adapter ...
filter="remoteFilter">...</...
<bean class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter">
<constructor-arg name="store" ref="metadataStore"/>
<constructor-arg value="myapp"/>
</bean>
<bean name="metadataStore" class="org.springframework.integration.metadata.PropertiesPersistingMetadataStore">
<property name="baseDirectory" value="./metadata"/>
</bean>