Spring Integration FTP - опрос без перевода?
Я хотел бы использовать Spring Integration для инициирования сообщений о файлах, которые появляются в удаленном месте, без фактической их передачи. Все, что мне нужно, это генерация сообщения, скажем, со значениями заголовка, указывающими путь к файлу и имя файла.
Какой лучший способ сделать это? Я попытался связать воедино адаптер входящего канала FTP с активатором службы, чтобы записать значения заголовков, которые мне нужны, но это приводит к тому, что файл переносится в локальный временный каталог, и к тому времени, когда активатор службы видит его, сообщение состоит из файла java.io.File, который ссылается на локальный файл и информация об удаленном пути исчезла. Можно ли преобразовать сообщение до этой локальной передачи?
1 ответ
У нас похожая проблема, и мы решили ее с помощью фильтров. На входящем канале-адаптере вы можете установить собственную реализацию фильтра. Поэтому перед опросом будет вызван ваш фильтр, и у вас будет вся информация о файлах, из которой вы можете решить, будет ли этот файл загружен или нет, например;
<int-sftp:inbound-channel-adapter id="test"
session-factory="sftpSessionFactory"
channel="testChannel"
remote-directory="${sftp.remote.dir}"
local-directory="${sftp.local.dir}"
filter="customFilter"
delete-remote-files="false">
<int:poller trigger="pollingTrigger" max-messages-per-poll="${sftp.max.msg}"/>
</int-sftp:inbound-channel-adapter>
<beans:bean id="customFilter" class="your.class.location.SftpRemoteFilter"/>
Класс Filter - это просто реализация интерфейса FileListFilter. Вот это фиктивная реализация фильтра.
public class SftpRemoteFilter implements FileListFilter<LsEntry> {
private static final Logger log = LoggerFactory.getLogger(SftpRemoteFilter.class);
@Override
public final List<LsEntry> filterFiles(LsEntry[] files) {
log.info("Here is files.");
//Do something smart
return Collections.emptyList();
}
}
Но если вы хотите сделать это, как вы описали, я думаю, что это можно сделать, установив заголовки для полезных нагрузок, а затем используя те же заголовки, когда вы используете эту полезную нагрузку, но в этом случае вы должны использовать Message<File>
Вместо этого Файл в вашем методе активатора службы.