2014-09-10 2 views
2

Я хотел бы использовать Spring Integration для инициирования сообщений около файлов, которые отображаются в удаленном месте, без фактической их передачи. Все, что мне нужно, это генерация сообщения с, скажем, заголовками, указывающими путь к файлу и имени файла.Spring Integration FTP - опрос без передачи?

Каков наилучший способ для этого? Я попытался связать адаптер входящего канала FTP с активатором службы, чтобы записать нужные мне значения заголовка, но это приводит к тому, что файл будет передан в локальный каталог temp, и к тому моменту, когда его видит активатор службы, сообщение состоит из файла java.io.File, который ссылается на файл local и удаленная информация о пути исчезла. Можно ли трансформировать сообщение до появления этого локального переноса?

+0

Я также попытался использовать трансформатор вместо активатора службы, чтобы увидеть, будет ли какая-то разница в сообщении. Нет, он все еще несет в качестве полезной нагрузки java.io.File, указывающий на локальный файл, без заголовков, идентифицирующих исходное удаленное местоположение. – Jeff

ответ

2

У нас есть аналогичная проблема, и мы решили это с помощью фильтров. На входящем-канальном адаптере вы можете настроить пользовательскую фильтрацию. Поэтому перед опросом будет вызываться ваш фильтр, и вы будете иметь всю информацию о файлах, из которых вы можете решить, будет ли этот файл загружен или нет, например;

<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"/> 

Класс фильтра - это просто реализация интерфейса 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> вместо этого Файл в вашем способе активации актива.

+1

Этот базовый подход работает. Обратите внимание, что filterFiles должен возвращать пустой список, а не false, как в вашем примере кода. В моем случае я смог вызвать MessageTemplate для отправки свежего сообщения на другом канале из фильтра, а затем всегда возвращает пустой список, чтобы избежать загрузки файлов или генерации сообщений на исходном канале. Это немного похоже на то, что мы работаем против дизайна фреймворка, но я готов принять его, поскольку я не вижу альтернативы, которая не связана с написанием нового типа адаптера канала. – Jeff

+0

Извините за опечатки. Теперь это исправлено. –

Смежные вопросы