【问题标题】:FileSystemAcceptOnceFilelistFilter is not working文件系统 AcceptOnceFilelistFilter 不工作
【发布时间】:2018-08-27 22:17:48
【问题描述】:

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

由于文件 nio 锁不工作,建议考虑使用基于共享 ConcurrentMetadataStore() - PropertiesPersistingMetadataStore 的 FileSystemPersistentAcceptOnceFileListFilter。预计,这种方式真的只有一个实例会拿起文件进行处理。所有其他人将跳过它并转到下一个文件。

但是两个实例选择的一些文件选择/轮询相同的文件并将其处理到目标路径。

有什么建议吗?

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

【问题讨论】:

    标签: java spring spring-boot spring-integration spring-integration-sftp


    【解决方案1】:

    首先,不清楚为什么在同一台机器上会有同一个应用程序的多个实例。对于相同的 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 文件。

    【讨论】:

    • 但是PropertiesPersistingMetadataStore在PropertiesPersistingMetadataStore的spring bean初始化后(afterPropertiesSet)不会更新。这意味着 PropertiesPersistingMetadataStore 将随着另一个实例更新文件而更新。
    • 没错。考虑使用提到的FileSystemPersistentAcceptOnceFileListFilter
    • NioFileLocker、PropertiesPersistingMetadataStore 和 SimpleMetadataStore 是否不适合多个并发实例(集群)? GemfireMetadataStore、JdbcMetadataStore、MongoDbMetadataStore、RedisMetadataStore 和 ZookeeperMetadataStore 是否可以考虑用于集群应用?
    • 内存中的任何东西都不适用于集群。您绝对需要考虑共享的内容
    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多