Весенняя интеграция с примером RedisLockRegistry
Мы реализуем поток, где <int-sftp:inbound-streaming-channel-adapter/>
опрашивает каталог для файла и при обнаружении передает поток активатору службы.
Проблема в том, что у нас будет запущено несколько экземпляров приложения, и мы хотели бы заблокировать процесс, чтобы только один экземпляр мог забрать файл.
Глядя на документацию, Redis Lock Registry выглядит как решение, есть ли пример того, как это используется в xml?
Все, что я могу найти, это несколько ссылок на него и исходный код для него.
http://docs.spring.io/spring-integration/reference/html/redis.html point 24.1
Добавленная информация: я добавил RedisMetaDataStore и SftpSimplePatternFileListFilter. Это работает, но у него есть одна странность: когда sftpInboundAdapter активируется поллером, он добавляет запись для каждого файла в метаданных хранилища. Скажем, есть 10 файлов, в хранилище данных будет 10 записей, но он не обрабатывает все 10 файлов за один раз, только один файл обрабатывается за опрос от адаптера, что было бы хорошо, но в нескольких случаях Если сервер, который подобрал файлы, вышел из строя после обработки 5 файлов, другой сервер, похоже, не подхватит оставшиеся 5 файлов, если только эти файлы не были "затронуты".
Правильно ли выбрано 1 файл для каждого опроса или он должен обрабатывать все действительные файлы в течение одного опроса?
Ниже мой 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>
1 ответ
Нет; вам нужно использовать SftpPersistentAcceptOnceFileListFilter
( документы здесь) с хранилищем метаданных Redis (или другим), а не с реестром блокировки.
РЕДАКТИРОВАТЬ
По поводу вашего комментария ниже.
Да, это известная проблема; в следующем выпуске мы добавили max-fetch-size
именно по этой причине - так что каждый экземпляр может получить некоторые файлы, а не первый экземпляр, захватив их все.
(Входящий адаптер работает, сначала копируя найденные файлы, которых еще нет в хранилище, на локальный диск, а затем выдает их по одному).
5.0 доступен только как этап M2 на момент написания, но текущую версию и этап репо можно найти здесь; он не будет выпущен еще несколько месяцев.
Другой альтернативой может быть использование исходящих шлюзов - один для LS файлов и один для получения отдельных файлов; Ваше приложение должно будет использовать само хранилище метаданных, чтобы определить, какие файлы могут быть извлечены.