如何在Spring Cloud Stream中新增或调整file supplier的配置
自定义Spring Cloud Stream File消息源的最优实现方案
你可以通过以下两种无侵入的方式实现自定义,不需要排除原配置类也不需要复制原有代码:
方案1:自定义FileReadingMessageSource Bean(优先推荐)
Spring Cloud Stream 内置的FileSupplierConfiguration中声明FileReadingMessageSource Bean时默认添加了@ConditionalOnMissingBean注解,你只需要在自己的应用配置类中声明同类型的Bean,添加你需要的自定义逻辑即可,Spring会优先使用你定义的Bean:
@Configuration public class CustomFileSourceConfig { @Bean public FileReadingMessageSource fileMessageSource( // 注入原配置依赖的属性类,复用官方默认配置 FileSupplierProperties properties, // 注入你自定义的FileListFilter FileListFilter<File> customFileFilter) { // 基础配置复用官方逻辑 FileReadingMessageSource source = new FileReadingMessageSource(); source.setDirectory(new File(properties.getDirectory())); source.setAutoCreateDirectory(properties.isAutoCreateDirectory()); // 组合原有规则和自定义过滤规则 CompositeFileListFilter<File> compositeFilter = new CompositeFileListFilter<>(); // 保留官方默认的文件名匹配规则 compositeFilter.addFilter(new SimplePatternFileListFilter(properties.getFilenamePattern())); // 追加自定义过滤规则 compositeFilter.addFilter(customFileFilter); source.setFilter(compositeFilter); // 其他官方属性可按需复用配置,比如防重复读取的持久化过滤器等 return source; } }
方案2:使用BeanPostProcessor后置修改已有Bean
如果你不想完全重写FileReadingMessageSource的初始化逻辑,仅需要在原有实例基础上追加配置,可以实现BeanPostProcessor接口,匹配到目标Bean后做修改:
@Component public class FileMessageSourcePostProcessor implements BeanPostProcessor { @Autowired private FileListFilter<File> customFileFilter; @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof FileReadingMessageSource && "fileMessageSource".equals(beanName)) { FileReadingMessageSource source = (FileReadingMessageSource) bean; // 拿到原有Filter,和自定义Filter组合使用 FileListFilter<File> originalFilter = source.getFilter(); CompositeFileListFilter<File> compositeFilter = new CompositeFileListFilter<>(); compositeFilter.addFilter(originalFilter); compositeFilter.addFilter(customFileFilter); source.setFilter(compositeFilter); } return bean; } }
提示:如果需要调整过滤规则的执行顺序,调整
CompositeFileListFilter的添加顺序即可。
内容的提问来源于stack exchange,提问作者E-Riz
相关产品推荐
相关产品推荐

