我正在尝试处理与此问题完全相同的文件: 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;
}
答案 0 :(得分:0)
如果您分享更多StackTrace进行调查会更好。
另外,我没有看到你按照解决方案的建议关闭会话:
当将远程文件作为流使用时,用户负责在使用流之后关闭会话。为方便起见,
Session
标题中提供了file_remoteSession
。
<int:service-activator input-channel="markers"
expression="payload.mark.toString().equals('END') ? headers['file_remoteSession'].close() : null"/>
的样本
另一方面,最好在同一个线程中使用InputStream
。没有将这种低级别的会话绑定资源转移到队列。
请检查这个错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=359184。也许你真的应该升级到更新鲜的东西:http://search.maven.org/#search|ga|1|g%3A%22com.jcraft%22