我正在尝试使用spring集成逐行读取远程文件。使用找到的here弹簧文档我已经设置了我的项目来轮询文件,并在找到文件时通过sftp传输它。我被困在如何一次一行地读取文件内容。
这是我的入站通道适配器设置,目前可用于提取文件。
<int-sftp:inbound-channel-adapter id="sftpAdapterAutoCreate"
session-factory="sftpSessionFactory"
channel="receiveChannel"
filename-pattern="*.txt"
remote-directory="/home/springftp"
preserve-timestamp="true"
local-directory="file:C:\sprintftp"
auto-create-local-directory="true"
temporary-file-suffix=".writing"
delete-remote-files="false">
<int:poller fixed-rate="1000" max-messages-per-poll="1"/>
</int-sftp:inbound-channel-adapter>
<int:channel id="receiveChannel">
<int:queue/>
</int:channel>
编辑:为了澄清,我想从远程文件一次检索一行,然后处理该行的内容,然后检索下一行。类似于为本地文件创建java.io.inputstream并逐行读取它。
非常感谢任何帮助。谢谢!
答案 0 :(得分:2)
您可以在接收文件和<file-to-string-transformer>
之后使用<splitter>
将payload
的内容分隔到行列表。
<强>更新强>
我想从远程文件中一次检索一行,然后处理该行的内容,然后检索下一行。类似于为本地文件创建java.io.inputstream并逐行读取它。
嗯,不幸的是,我们没有为此提供高级组件,但您可以尝试使用RemoteFileTemplate
中的功能:
RemoteFileTemplate<FTPFile> template = new RemoteFileTemplate<FTPFile>(this.ftpSessionFactory);
template.setFileNameExpression(new SpelExpressionParser().parseExpression("payload"));
template.setBeanFactory(mock(BeanFactory.class));
template.afterPropertiesSet();
final ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
template.get(new GenericMessage<String>("ftpSource/ftpSource1.txt"), new InputStreamCallback() {
@Override
public void doWithInputStream(InputStream stream) throws IOException {
FileCopyUtils.copy(stream, baos1);
}
});
这段代码可以提供给您的POJO服务,并使用<service-activator>
连接最后一个。