FileSystemAcceptOnceFilelistFilter不起作用

时间:2018-08-27 22:17:48

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

有一个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>

1 个答案:

答案 0 :(得分:1)

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

另一个问题是gcloud beta functions deploy helloworld2 --runtime nodejs8 --trigger-http 对于分布式计算的影响不大。您绝对需要考虑对共享数据库使用一些商店实现。

此外,您还可以通过以下方式使当前解决方案非常接近您想要的解决方案:

helloworld2
对于上述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文件中。