Spring integration 监视远程目录中添加的文件,并通过SFTP对其进行流式处理以读取数据

Spring integration 监视远程目录中添加的文件,并通过SFTP对其进行流式处理以读取数据,spring-integration,sftp,spring-integration-sftp,Spring Integration,Sftp,Spring Integration Sftp,我想在远程机器上为新添加的CSV文件或未读文件添加手表。一旦文件被识别,根据文件名中的时间戳读取它。文件将使用流媒体而不是本地计算机读取。读取文件时,将_reading附加到文件名,并在读取文件后附加_read。该文件将通过SFTP协议读取,我计划使用spring集成SFTP。如果读取文件时出错或文件中的数据不符合预期,我希望将该文件移动到子目录中 <dependency> <groupId>org.springframework.integra

我想在远程机器上为新添加的CSV文件或未读文件添加手表。一旦文件被识别,根据文件名中的时间戳读取它。文件将使用流媒体而不是本地计算机读取。读取文件时,将_reading附加到文件名,并在读取文件后附加_read。该文件将通过SFTP协议读取,我计划使用spring集成SFTP。如果读取文件时出错或文件中的数据不符合预期,我希望将该文件移动到子目录中

 <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-sftp</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-core</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>

Spring boot version 2.0.3.RELEASE   
我尝试轮询远程目录并读取一次CSV文件。一旦读取,我将从目录中删除该文件

 <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-sftp</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-core</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>

Spring boot version 2.0.3.RELEASE   

org.springframework.integration
spring集成sftp
5.1.0.1发布
org.springframework.integration
spring集成核心
5.0.6.1发布
Spring boot版本2.0.3.0发布
@Bean
公共会话工厂sftpSessionFactory(){
DefaultSftpSessionFactory=新的DefaultSftpSessionFactory(true);
setHost(主机名);
工厂设置端口(22);
setUser(用户名);
出厂设置密码(密码);
工厂。setAllowUnknownKeys(真);
返回新的CachingSessionFactory(工厂);
}
@豆子
public MessageSource sftpMessageSource(){
SftpStreamingMessageSource messageSource=新的SftpStreamingMessageSource(模板());
messageSource.setRemoteDirectory(路径);
setFilter(compositeFilters());
返回消息源;
}
公共CompositeFileListFilter compositeFilters(){
返回新的CompositeFileListFilter()
.addFilter(新的sfternFileListFilter(“%csv”);
}
@豆子
公共SftpRemoteFileTemplate模板(){
返回新的SftpRemoteFileTemplate(sftpSessionFactory());
}
@豆子
公共集成流sftpOutboundListFlow(){
返回IntegrationFlows.from(this.sftpMessageSource(),e->e.poller(Pollers.fixedDelay(5,TimeUnit.SECONDS)))
.handle(Sftp.outboundGateway(template(),NLST,path).options(Option.RECURSIVE)))
.filter(compositeFilters())
.transform(sorter())
.split()
.handle(Sftp.outboundGateway(template(),GET,“headers['file\u remoteDirectory']+headers['file\u remoteFile'])。选项(流))
.transform(csvToPojoTransformer())
.handle(服务())
.handle(Sftp.outboundGateway(template(),MV,“headers['file\u remoteDirectory']+headers['file\u remoteFile']+\u read”))
.handle(在()之后)
.get();
}
@豆子
公共消息处理程序分类器(){
返回新的MessageHandler(){
@凌驾
public void handleMessage(消息消息消息)引发MessaginException{
List fileNames=(List)message.getPayload();
Collections.sort(文件名);
}
};
}
@豆子
public MessageHandler csvToPojoTransformer(){
返回新的MessageHandler(){
@凌驾
public void handleMessage(消息消息消息)引发MessaginException{
InputStreamData=(InputStream)message.getPayload();
convertStreamtoObject(streamData,Class.Class);
}
};
}
公共列表convertStreamtoObject(InputStream InputStream,类clazz){
HeaderColumnNameMappingStrategy ms=新的HeaderColumnNameMappingStrategy();
setType女士(clazz);
Reader Reader=新的InputStreamReader(inputStream);
CsvToBean cb=新的CsvToBeanBuilder(读卡器)
.withType(clazz)
.withMappingStrategy(ms)
.使用Kiplines(0)
.带分隔符(“|”)
.WithThroweException(真)
.build();
返回cb.parse();
}
@豆子
public MessageHandler服务(){
返回新的MessageHandler(){
@凌驾
public void handleMessage(消息消息消息)引发MessaginException{
List csvDataAsListOfPojo=Listmessage.getPayload();
//用这个
}
};
}
@豆子
public expressionEvaluationRequestHandlerAdvice之后(){
ExpressionEvaluationRequestHandlerAdvice通知=新的ExpressionEvaluationRequestHandlerAdvice();
advice.setSuccessChannelName(“success.input”);
advice.setOnSuccessExpressionString(“有效负载+”已成功“);
advice.setFailureChannelName(“failure.input”);
advice.setOnFailureExpressionString(“有效负载+”不正确,原因为“+#exception.cause.message”);
建议.setTrapException(真);
回信;
}
@豆子
公共集成流成功(){
返回f->f.handle(系统输出::println);
}
@豆子
公共集成流失败(){
返回f->f.handle(系统输出::println);
}
更新的代码

对于复杂场景(列表、移动、获取、删除等),您应该使用

SFTP出站网关提供一组有限的命令,允许您与远程SFTP服务器交互:

ls(列表文件)

nlst(列出文件名)

获取(检索文件)

mget(检索多个文件)

rm(删除文件))

mv(移动和重命名文件)

放置(发送文件)

mput(发送多个文件)

或者直接从代码中使用
SftpRemoteFileTemplate

编辑

回应你的评论;你需要这样的东西

  • 入站通道适配器(带轮询器)-返回目录名
  • LS网关
  • 筛选(删除fetc中已存在的任何文件)