【发布时间】:2025-12-31 19:25:05
【问题描述】:
我有一个这样定义的弹簧输入通道
<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;
}
}
【问题讨论】:
-
您知道,您的问题并不清楚。
TEST.SQQ、EST.SQQ-20170204.PQQ和TEST.SQQ-20170204.PQQ.20170304.PQQ是真正不同的文件名......也不知道你为什么要向我们展示<file:inbound-channel-adapter>。请改写你的问题。我还看到您的<int-ftp:inbound-channel-adapter>没有任何filter用于远程目录。 -
远程位置只有一个文件 - TEST.SQQ。如果同一个文件再次被轮询,那没关系。我归档已处理的文件。但是,每次 sqqFtpInbound 适配器选择文件时,相同的文件都会返回并以不同的不同名称存储在我的本地文件存储中。因此,我不得不一次又一次地处理文件。
-
问题陈述很清楚。远程目录只有一个文件。当入站适配器轮询它并且我的本地过滤器开始处理它时,我得到具有不同名称的文件名。我展示了所有配置,只是为了确保我没有搞砸任何配置。
-
我不想为远程目录添加任何过滤器。
-
我还告诉SQQ保存一些客户信息。实际名称是 PQQ。从我附上的图片可以看出这一点。似乎千言万语无法解释图像的作用。
标签: spring-integration spring-integration-sftp