FileSystemAcceptOnceFilelistFilter не работает - PullRequest
0 голосов
/ 28 августа 2018

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

Поскольку файл nio locker не работает, рекомендуется использовать FileSystemPersistentAcceptOnceFileListFilter, основанный на общем ConcurrentMetadataStore () - PropertiesPersistingMetadataStore. Ожидается, что таким образом только один экземпляр получит файл для обработки. Все остальные пропустят его и перейдут к следующим файлам.

Но некоторые файлы, выбранные обоими экземплярами, выбирают / опрашивают один и тот же файл и обрабатывают его по целевому пути.

Есть предложения?

 <bean id="metadatastore" class = "org.springframework.integration.metadata.PropertiesPersistingMetadataStore">
 <property name="basedirectory" value ="${java.io.tmpdir}/metadata"/>
 </bean>
 <bean id="inboundfilter" class = "org.springframework.integration.file.filters.CompositeFilelistFilter">
   <constructor-arg>
     <list>
       <bean class = "org.springframework.integration.file.filters.FileSystemPersistentAcceptOnceFilelistFilter">
          <constructor-arg name= "store" ref="metadatastore"/>
    <!-- Filename prefix constructor.  No prefix name in my case .so made it empty-->
          <constructor-arg value = ""/>
        </bean>
        <bean class = "org.springframework.integration.file.filters.RegexPatternFilelistFilter">
          <constructor-arg value="${regex}"/>
        </bean>
      </list>
  </constructor-arg>
 </bean>

1 Ответ

0 голосов
/ 28 августа 2018

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

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

Также вы можете приблизить текущее решение к тому, что вы хотели бы получить с помощью:

/**
 * Determine whether the metadataStore should be flushed on each update (if {@link Flushable}).
 * @param flushOnUpdate true to flush.
 * @since 4.1.5
 */
public void setFlushOnUpdate(boolean flushOnUpdate) {

как true для упомянутого FileSystemPersistentAcceptOnceFilelistFilter. Таким образом, PropertiesPersistingMetadataStore будет мигать в целевой файл .properties после каждой записи в хранилище.

...