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> Вместо этого Файл в вашем методе активатора службы.

Другие вопросы по тегам