У меня есть такой простой поток, который читает файл из папки и конвертирует содержимое этого файла в несколько сущностей в базе данных (spring-integration-jpa). Только что обнаружил, что я не вижу простого способа удалить обработанный файл из исходного каталога.
Вот код
@Configuration
public class ImportConfiguration {
private static final Logger logger = LoggerFactory.getLogger(ImportConfiguration.class);
@Value("${source.dir.path}")
private String sourceDirectoryPath;
@Value("${dest.dir.path}")
private String destDirectoryPath;
@Autowired
private EntityManagerFactory entityManagerFactory;
@Bean
public MessageSource<File> sourceDirectory() {
FileReadingMessageSource messageSource = new FileReadingMessageSource();
messageSource.setDirectory(new File(sourceDirectoryPath));
messageSource.setAutoCreateDirectory(true);
return messageSource;
}
@Bean
public JpaUpdatingOutboundEndpointSpec jpaPersistHandler() {
return Jpa.outboundAdapter(this.entityManagerFactory)
.entityClass(Brand.class)
.persistMode(PersistMode.PERSIST);
}
@Bean
public IntegrationFlow fileMoveFlow() {
return IntegrationFlows.from(sourceDirectory(), conf -> conf.poller(Pollers.fixedDelay(2000)))
.filter(msg -> ((File) msg).getName().endsWith(".txt"))
.transform(new FileToStringTransformer())
.split(s -> s.delimiters("\n"))
.<String, Brand>transform(name -> {
Brand brand = new Brand();
brand.setName(name);
return brand;
})
.handle(jpaPersistHandler(), ConsumerEndpointSpec::transactional)
.get();
}
}
Если вы используете FileWritingMessageHandler
, все будет очень просто, потому что есть метод setDeleteSourceFiles
, но с JpaUpdatingOutboundEndpointSpe c все не так просто.