FileSystemAcceptOnceFilelistFilter 不工作

FileSystemAcceptOnceFilelistFilter is not working

有一个 spring 引导应用程序,它将文件从源路径路由到目标路径。试图 运行 多个应用程序实例指向同一源路径。期望只有一个实例应该处理一个文件,一旦处理,它将从源中删除。同一文件不应由其他实例处理。

由于文件 nio 储物柜不工作,建议考虑使用基于共享的 ConcurrentMetadataStore() - PropertiesPersistingMetadataStore 的 FileSystemPersistentAcceptOnceFileListFilter。预计,这种方式实际上只有一个实例会拾取文件进行处理。所有其他人将跳过它并继续下一个文件。

但是两个实例都选择了一些文件 picks/polls 同一个文件并将其处理到目标路径。

有什么建议吗?

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

首先,不清楚为什么同一台机器上会有同一应用程序的多个实例。对于相同的 CPU 和 RAM,相同的应用程序绝对没有性能提升。

另一个问题是 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 文件。