相同的文件在 spring-ftp 中一次又一次地被拾取,但名称不同
Same file gets picked up again and again in spring-ftp but with different names
我有一个这样定义的spring输入通道
<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;
}
}
我认为您的自定义 local-filter
有一些漏洞依赖于一个不存在的事实来等待来自远程存储的唯一文件。
您应该确保该能力,因为默认情况下它不会切换。
为此考虑将 filter
选项添加到 <int-ftp:inbound-channel-adapter>
作为对 AcceptOnceFileListFilter
或 FtpPersistentAcceptOnceFileListFilter
的引用。
我们对此事有 JIRA。
请确认这对您来说确实是个问题,我们可能会修改该工单的优先级,并会尽快解决。
我有一个这样定义的spring输入通道
<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;
}
}
我认为您的自定义 local-filter
有一些漏洞依赖于一个不存在的事实来等待来自远程存储的唯一文件。
您应该确保该能力,因为默认情况下它不会切换。
为此考虑将 filter
选项添加到 <int-ftp:inbound-channel-adapter>
作为对 AcceptOnceFileListFilter
或 FtpPersistentAcceptOnceFileListFilter
的引用。
我们对此事有 JIRA。
请确认这对您来说确实是个问题,我们可能会修改该工单的优先级,并会尽快解决。