我有一个配置类,它不断地轮询我的FTP目录。奇怪的行为是,SftpPersistentAcceptOnceFileListFilter立即将文件保存在元数据存储表中,但不会立即被作业启动程序提取以供处理。我必须手动从元数据存储表3-4次删除该条目,然后文件将被拾取。是代码问题还是FTP服务器问题?弄不清楚..。
知道我是不是错过了什么吗?
@Bean
public IntegrationFlow sftpInboundNocFlow(FileNocMessageToJobRequest fileNocMessageToJobRequest) throws Exception {
return IntegrationFlows
.from(s -> s.sftp(this.sftpConfig.sftpSessionFactory())
.filter(this.sftpPersistantNocFilter())
.preserveTimestamp(true)
.remoteDirectory(this.sftpProperties.getRemoteOutboundDirectoryNoc())
.deleteRemoteFiles(this.sftpProperties.isDeleteRemoteFilesEnabled())
.autoCreateLocalDirectory(true)
.localDirectory(new File(FileUtils.getTempDirectoryPath() + this.sftpProperties.getLocalInboundDirectoryNoc())),
e -> e.id("sftpInboundNocAdapter")
.autoStartup(true)
.poller(Pollers.fixedDelay(9000)))
.handle(fileNocMessageToJobRequest)
.handle(this.jobNocLaunchingGateway())
.log(LoggingHandler.Level.WARN, ">>>>>>>>>>headers.id + ': ' + payload")
.channel("nullChannel")
.get();
}
@Bean
public CompositeFileListFilter sftpPersistantNocFilter() {
log.info("sftpPersistantNocFilter is called");
CompositeFileListFilter nocfilters = new CompositeFileListFilter();
nocfilters.addFilter(new SftpPersistentAcceptOnceFileListFilter(this.metadataStore(),"Downloaded_File:"));
nocfilters.addFilter(new SftpRegexPatternFileListFilter(".*\\bNOC\\b.*"));
// nocfilters.addFilter(new SftpSimplePatternFileListFilter("*.csv"));
return nocfilters;
}发布于 2019-10-07 12:39:23
显然,文件已经存储在本地目录和内存中的元数据存储中,用于这些本地文件。您应该考虑更改一个local-filter:
您可以使用本地筛选器属性来配置本地文件系统过滤器的行为。从4.3.8版本开始,默认情况下配置FileSystemPersistentAcceptOnceFileListFilter。此过滤器将接受的文件名和修改后的时间戳存储在MetadataStore策略的实例中(请参阅元数据存储),并检测对本地文件修改时间的更改。默认的MetadataStore是一个在内存中存储状态的SimpleMetadataStore。
有关更多信息,请参见docs:https://docs.spring.io/spring-integration/docs/5.2.0.RELEASE/reference/html/sftp.html#sftp
https://stackoverflow.com/questions/58265412
复制相似问题