2017-02-17 19 views
1

Мы реализуем поток, в котором <int-sftp:inbound-streaming-channel-adapter/> проверяет каталог для файла и обнаруживает, что он передает поток активатору службы.Весенняя интеграция с примером RedisLockRegistry

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

Просмотрев документацию, Redis Lock Registry выглядит как решение, есть ли пример использования этого приложения в xml?

Все, что я могу найти, это несколько ссылок на него и его исходный код.

http://docs.spring.io/spring-integration/reference/html/redis.html точка 24,1

Добавлена ​​информация: Ive добавил RedisMetaDataStore и SftpSimplePatternFileListFilter. Он работает, но у него есть одна странность, когда sftpInboundAdapter активируется poller, он добавляет запись для каждого файла в метаданных. Скажем, что есть 10 файлов, в хранилище данных будет 10 записей, но он не обрабатывает все 10 файлов в «1 go», обрабатывается только 1 файл за опрос от адаптера, что было бы неплохо, но в нескольких экземплярах если сервер, который взял файлы, упал после обработки 5 файлов, другой сервер, похоже, не забирает оставшиеся 5 файлов, если файлы не «тронуты».

Правильно ли выполняется выбор одного файла за опрос или он должен обрабатывать все действительные файлы в течение одного опроса.

Ниже мой XML

<int:channel id="sftpInbound"/> <!-- To Java --> 
<int:channel id="sftpOutbound"/> 
<int:channel id="sftpStreamTransformer"/> 

<int-sftp:inbound-streaming-channel-adapter id="sftpInboundAdapter" 
     channel="sftpInbound" 
     session-factory="sftpSessionFactory" 
     filter="compositeFilter" 
     remote-file-separator="/" 
     remote-directory="${sftp.directory}"> 
    <int:poller cron="${sftp.cron}"/> 
</int-sftp:inbound-streaming-channel-adapter> 

<int:stream-transformer input-channel="sftpStreamTransformer" output-channel="sftpOutbound"/> 

<bean id="compositeFilter" 
    class="org.springframework.integration.file.filters.CompositeFileListFilter"> 
    <constructor-arg> 
     <list> 
      <bean 
       class="org.springframework.integration.sftp.filters.SftpSimplePatternFileListFilter"> 
       <constructor-arg value="Receipt*.txt" /> 
      </bean> 
      <bean id="SftpPersistentAcceptOnceFileListFilter" class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter"> 
       <constructor-arg ref="metadataStore" />     
       <constructor-arg value="ReceiptLock_" />      
      </bean> 
     </list> 
    </constructor-arg> 
</bean> 

<bean id="redisConnectionFactory" 
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> 
    <property name="port" value="${redis.port}" /> 
    <property name="password" value="${redis.password}" /> 
    <property name="hostName" value="${redis.host}" /> 
</bean> 

ответ

0

Нет; вам необходимо использовать SftpPersistentAcceptOnceFileListFilter (docs here) с хранилищем метаданных Redis (или некоторых других), а не реестра блокировки.

EDIT

Что касается Вашего комментария ниже.

Да, это известная проблема; в next release мы добавили max-fetch-size именно по этой причине - поэтому экземпляры могут извлекать некоторые из файлов, а не первый экземпляр, захватывая их все.

(входящий адаптер работает, сначала скопировав найденные файлы, которые еще не находятся в хранилище, на локальный диск, а затем издает их по одному).

5.0 только доступно как веха прямо сейчас M2 at the time of writing, but the current version and milestone repo can be found here; он не будет выпущен еще на несколько месяцев.

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

+0

Спасибо Гэри, Ive реализовано, как вы предложили, и я думаю, что его почти там, я добавил дополнительную информацию к исходному вопросу, объясняющему проблему. – sdiaz1000

+0

См. Изменение в моем ответе для получения дополнительной информации. –

+0

Ive просто сработал, я добавил атрибут max-messages-per-poll для poller и установил его в 10, отлично работает. Благодарю. – sdiaz1000

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

  • Нет связанных вопросов^_^