Пример интеграции Spring с RedisLockRegistry

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

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

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

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

http://docs.spring.io/spring-integration/reference/html/redis.html пункт 24.1

Добавленная информация: Я добавил RedisMetaDataStore и SftpSimplePatternFileListFilter. Он работает, но у него есть одна странность: когда sftpInboundAdapter активируется опросчиком, он добавляет запись для каждого файла в хранилище метаданных. Скажем, есть 10 файлов, в хранилище данных будет 10 записей, но он не обрабатывает все 10 файлов за один раз, только 1 файл обрабатывается за один опрос от адаптера, что было бы хорошо, но в нескольких экземплярах окружающая среда, если сервер, который взял файлы, отключился после обработки 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>

person sdiaz1000    schedule 17.02.2017    source источник


Ответы (1)


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

ИЗМЕНИТЬ

Относительно вашего комментария ниже.

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

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

5.0 доступен только в качестве вехи прямо сейчас M2 на момент написания, но текущая версия и репозиторий вехи могут можно найти здесь; он не выйдет еще несколько месяцев.

Другой альтернативой было бы использование исходящих шлюзов - один для LS-файлов, а второй - для ПОЛУЧЕНИЯ отдельных файлов; однако ваше приложение должно использовать само хранилище метаданных, чтобы определить, какие файлы можно получить.

person Gary Russell    schedule 17.02.2017
comment
Спасибо, Гэри, я реализовал, как вы предложили, и я думаю, что он почти готов. Я добавил дополнительную информацию к исходному вопросу, объясняющему проблему. - person sdiaz1000; 23.02.2017
comment
Я только что решил это, я добавил атрибут max-messages-per-poll в poller и установил его на 10, работает нормально. Благодарю. - person sdiaz1000; 23.02.2017
comment
Верно; Извините, я тоже должен был упомянуть об этом; но с 5.0 вы можете добиться более справедливого распределения по экземплярам. - person Gary Russell; 23.02.2017