使用SFTP出站网关获取输入流

时间:2016-06-03 23:27:34

标签: spring-integration

我正在尝试处理与此问题完全相同的文件: read a remote file line by line

这个问题的一个答案建议使用RemoteFileTemplate,但我是 尝试使用-stream选项,如上一条评论中所建议的那样 回答。此外,这似乎是-stream选项的重点;得到一个流。

我的实现成功获取了InputStream并启动了一个单独的线程 在BufferedReader中进行处理。

这在Windows笔记本电脑上很有效,但在Linux机器上部署我 有时会在尝试阅读时遇到“写死”异常 我的处理线程中的BufferedReader。

对此的研究表明作者没有正确关闭流: Write end dead exception using PipedInputStream

所以,这是弹簧集成中的一个错误,或者缺少某些东西 在我的配置中。我希望它是后者,可以使用反馈 我获取InputStream的方式。如果我得到InputStream 正确的,那么如何在写入后让编写器关闭输入流?

谢谢!

以下是出站网关配置:

<int-ftp:outbound-gateway session-factory="ftpClientFactory"
    request-channel="inboundGetStream" command="get" command-options="-stream"
    expression="payload" remote-directory="/" reply-channel="stream">
</int-ftp:outbound-gateway>

<int:channel id="stream">
    <int:queue/>
</int:channel>

这是我获取InputStream的地方:

public InputStream openFileStream(final String filename, final String directory) throws Exception {
    if (inboundGetStream.send(MessageBuilder.withPayload(directory + "/" + filename).build(), ftpTimeout)) {
        return getInputStream();
    }
    return null;
}

private InputStream getInputStream() {

    Message<?> msgs = stream.receive(ftpTimeout);

    if (msgs == null) {
        return null;
    }

    InputStream is = (InputStream) msgs.getPayload();
    return is;
}

1 个答案:

答案 0 :(得分:0)

如果您分享更多StackTrace进行调查会更好。

另外,我没有看到你按照解决方案的建议关闭会话:

  

当将远程文件作为流使用时,用户负责在使用流之后关闭会话。为方便起见,Session标题中提供了file_remoteSession

<int:service-activator input-channel="markers"
           expression="payload.mark.toString().equals('END') ? headers['file_remoteSession'].close() : null"/>

来自Reference Manual

的样本

另一方面,最好在同一个线程中使用InputStream。没有将这种低级别的会话绑定资源转移到队列。

请检查这个错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=359184。也许你真的应该升级到更新鲜的东西:http://search.maven.org/#search|ga|1|g%3A%22com.jcraft%22