移除AcceptOnceFileListFilter缓存后,File input adapter仍不处理同名文件
几个优先排查的点
过滤器实例是否为同一个?
你通过@Autowired注入的AcceptOnceFileListFilter,和ChainFileListFilter内部引用的可能是两个独立实例!如果清理的是外部注入实例的缓存,而过滤器链里的实例缓存没动,同名文件自然会被持续拦截。
验证方式:打印两个实例的hashCode,若数值不同,说明XML配置ChainFileListFilter时,你没有引用全局的AcceptOnceFileListFilterBean,而是重新定义了新的实例,导致缓存不共享。前序过滤器是否拦截了新文件?
别只盯着AcceptOnceFileListFilter,先确认新文件能通过RegexPatternFileListFilter——比如正则表达式是否匹配新文件的后缀、文件名?是否被你提到的第一个过滤器(疑似笔误,如自定义过滤器)拦截?
验证方式:给每个过滤器添加日志,打印每次过滤后的文件列表,看新文件是否能走到AcceptOnceFileListFilter这一步。文件对象的标识是否一致?
AcceptOnceFileListFilter依赖File的equals和hashCode识别文件,你清理缓存用的File对象,和过滤器中存储的可能不是同一标识——比如新文件同名但路径不同,或你用相对路径创建对象、过滤器存储的是绝对路径实例。
验证方式:打印文件的getAbsolutePath()和lastModified(),确认两次处理的是同一标识的文件。
修复步骤
强制过滤器实例共享
XML配置中必须让ChainFileListFilter引用全局的AcceptOnceFileListFilterBean,禁止重复定义。示例:<!-- 定义全局唯一的AcceptOnce Bean --> <bean id="acceptOnceFilter" class="org.springframework.integration.file.filters.AcceptOnceFileListFilter"/> <!-- 过滤器链中直接引用该Bean --> <bean id="chainFilter" class="org.springframework.integration.file.filters.ChainFileListFilter"> <property name="filters"> <list> <ref bean="yourFirstFilter"/> <!-- 你的第一个过滤器 --> <ref bean="regexPatternFilter"/> <!-- 正则过滤器 --> <ref bean="acceptOnceFilter"/> <!-- 引用全局实例,禁止重新定义 --> </list> </property> </bean>这样注入的
acceptOnceFilter和过滤器链内的实例完全一致,清理缓存才会生效。修正缓存清理逻辑
避免随意传递File对象调用remove,建议用绝对路径创建File实例,保证与过滤器内存储的标识完全匹配:File targetFile = new File(file.getAbsolutePath()); acceptOnceFilter.remove(targetFile);若业务允许,直接调用
acceptOnceFilter.clear()清空整个缓存,操作更稳妥。刷新文件读取源配置
如果你使用FileReadingMessageSource,它可能会缓存过滤结果。清理完过滤器缓存后,需刷新源配置:fileReadingMessageSource.setFileListFilter(chainFilter); fileReadingMessageSource.afterPropertiesSet();
内容的提问来源于stack exchange,提问作者rairai

