我有一个像这样定义的弹簧输入通道
<file:inbound-channel-adapter prevent-duplicates="false" id="inpChannel" directory="file:/Users/abhisheksingh/req" auto-startup="true">
<int:poller id="poller" fixed-delay="1000" />
</file:inbound-channel-adapter>
<int:service-activator input-channel="inpChannel" ref="inpHandler" />
文件名示例为TEST.SQQ。 SQQ是客户端用于将文件放在ftp中的文件格式。但是,我看到spring ftp适配器一次又一次地使用不同的文件名拾取相同的文件。所以第一次是TEST.SQQ。然后下一次它是TEST.SQQ-20170204.PQQ然后下一次它是TEST.SQQ-20170204.PQQ.20170304.PQQ。这继续下去。我的终端上有一个过滤器,用于检查已处理文件的名称。但由于每次轮询的文件名不同,因此所有这些文件都被选中进行处理。
这是我的ftp适配器 -
<int-ftp:inbound-channel-adapter id="sqqFtpInbound"
channel="ftpChannel"
session-factory="sqqFtpClientFactory"
auto-create-local-directory="true"
delete-remote-files="false"
local-filter="acceptAllFileListFilter"
local-directory="file:/Users/abhisheksingh/ddrive/everge_ws/sqqReq" auto-startup="true" >
<int:poller id="poller" fixed-delay="1000" />
</int-ftp:inbound-channel-adapter>
这是我的ftp服务器映像 -
这是我的本地目录图片 -
我不明白为什么一次又一次地拾取同一个文件。我会感激一些帮助!
这是我的文件列表过滤器代码。
public class TestFileListFilter<F> extends AbstractFileListFilter<F> {
private static final Logger log = LoggerFactory.getLogger(EvergeFileListFilter.class);
@Override
protected boolean accept(F file) {
File f = (File) file;
if(f.getAbsolutePath().contains(".PQQ")) {
String newDir = "/Users/abhisheksingh/ddrive/sample/pqqReq/";
String archiveLocation = "/Users/abhisheksingh/ddrive/sample/pqqArchive/";
String fullName = archiveLocation + f.getName();
log.info("Check if the file has already been processed " + fullName);
File fl = new File(fullName);
final File dir = new File(archiveLocation);
for (final File child : dir.listFiles()) {
String archiveName = FilenameUtils.getBaseName(child.getName());
String inputName = FilenameUtils.getBaseName(fl.getName());
log.info("Archive file name is " + archiveName);
log.info("Input file name is " + inputName);
if(inputName.contains(archiveName)) {
log.info("The file is already processed "+inputName);
}
}
if(fl.exists()) {
log.error("PQQ file has already been processed.");
removeFile(f);
return false;
}else{
log.info("PQQ File received " + f.getAbsolutePath());
}
moveFile(f, newDir);
return true;
}
}
答案 0 :(得分:0)
我认为您的自定义local-filter
有一些漏洞可依赖于不存在的事实来等待来自远程存储的唯一文件。
你应该确保这种能力,因为它没有默认切换。
为此,请考虑在filter
添加<int-ftp:inbound-channel-adapter>
选项作为AcceptOnceFileListFilter
或FtpPersistentAcceptOnceFileListFilter
的参考。
我们对此事有JIRA。
请确认这对您来说确实是一个问题,我们可能会修改该机票的优先级,并会尽快解决。