我正在使用 SFTP 流式入站通道适配器,它一次性读取整个文件。它为我提供了一个输入流,稍后由流转换器进行转换。我想直接从服务器读取文件,而不是分块下载,这样如果我的文件太大,它就不会填满堆。我可以通过 Spring 集成来做到这一点吗?
总体思路是从远程文件服务器读取文件,而不下载到本地或临时文件夹并将其交给 Spring Batch。有没有办法通过 Spring 集成来做到这一点?
我想使用 Spring Batch,因为如果假设应用程序正在处理一个文件并且它死掉了,Spring Batch 可能会从失败的点恢复,如果我从元数据存储中删除条目,我可能会恢复。
嗯,这正是 SFTP 流式入站通道适配器的作用:
public class SftpStreamingMessageSource extends AbstractRemoteFileStreamingMessageSource<SftpClient.DirEntry> {
那个在哪里:
public abstract class AbstractRemoteFileStreamingMessageSource<F>
extends AbstractFetchLimitingMessageSource<InputStream> implements ManageableLifecycle {
因此,由这个
MessageSource
生成的消息有一个 InputStream
作为有效负载。这与内存消耗无关,除非您自己这样做。听起来你就是这么做的 StreamTransformer
:
/**
* Transforms an InputStream payload to a byte[] or String (if a
* charset is provided).
*
* @author Gary Russell
* @since 4.3
*
*/
public class StreamTransformer extends AbstractTransformer {
因此,如果这个从文件加载字节数组的简单方法
InputStream
不符合您的要求,您需要研究其他一些实现,您可以按照您需要的任何方式转换该InputStream
。
您可以查看
FileSplitter
,它能够迭代文件的行并为它们发出单独的消息:https://docs.spring.io/spring-integration/reference/file/splitter.html#page -标题