使用 sftp 流式入站适配器以块形式流式传输文件

问题描述 投票:0回答:1

我正在使用 SFTP 流式入站通道适配器,它一次性读取整个文件。它为我提供了一个输入流,稍后由流转换器进行转换。我想直接从服务器读取文件,而不是分块下载,这样如果我的文件太大,它就不会填满堆。我可以通过 Spring 集成来做到这一点吗?

总体思路是从远程文件服务器读取文件,而不下载到本地或临时文件夹并将其交给 Spring Batch。有没有办法通过 Spring 集成来做到这一点?

我想使用 Spring Batch,因为如果假设应用程序正在处理一个文件并且它死掉了,Spring Batch 可能会从失败的点恢复,如果我从元数据存储中删除条目,我可能会恢复。

spring spring-boot spring-batch spring-integration
1个回答
0
投票

嗯,这正是 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 -标题

© www.soinside.com 2019 - 2024. All rights reserved.