Один и тот же файл снова и снова берется в Spring-FTP, но с разными именами.
У меня есть пружинный входной канал, определенный так
<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. Тем не менее, я вижу, что весенний 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;
}
}
1 ответ
Я думаю твой обычай local-filter
имеет некоторые уязвимости, чтобы полагаться на несуществующий факт ожидания уникальных файлов из удаленного хранилища.
Вы должны убедиться, что эта способность не включена по умолчанию.
Для этого рассмотрите возможность добавления filter
вариант к <int-ftp:inbound-channel-adapter>
в качестве ссылки на AcceptOnceFileListFilter
или же FtpPersistentAcceptOnceFileListFilter
,
У нас есть JIRA по этому вопросу.
Пожалуйста, подтвердите, что это как раз проблема для вас, и мы можем пересмотреть приоритет для этого билета и исправим его в ближайшее время.