Я использую InboundChannelAdapter с Poller для обработки файлов каждые 30 секунд. Файлы невелики, но я понимаю, что потребление памяти продолжает расти, даже когда файлов нет.
@Bean
@InboundChannelAdapter(value = "flowFileInChannel" ,poller = @Poller(fixedDelay ="30000", maxMessagesPerPoll = "1"))
public MessageSource<File> flowInboundFileAdapter(@Value("${integration.path}") File directory) {
FileReadingMessageSource source = new FileReadingMessageSource();
source.setDirectory(directory);
source.setFilter(flowPathFileFilter);
source.setUseWatchService(true);
source.setScanEachPoll(true);
source.setAutoCreateDirectory(false);
return source;
}
Есть ли внутренняя очередь, которая не очищается после каждого опроса? Как настроить, чтобы память не съедала.
После более глубокого изучения кажется, что приведенные ниже Spring IntegrationFlows, которые обрабатывают данные из InboundChannelDapter, задерживают память после каждого опроса файла. После того, как я закомментировал среднюю часть, потребление памяти кажется стабильным (вместо увеличения потребления). Теперь мне интересно, как заставить Spring IntegrationFlows очищать эти сообщения и заголовки после того, как они передаются по разным каналам (т.е. после последнего канала ниже)
public IntegrationFlow incomingLocateFlow(){
return IntegrationFlows.from(locateIncomingChannel())
// .split("locateItemSplitter","split")
// .transform(locateItemEnrichmentTransformer)
// .transform(locateRequestTransformer)
// .aggregate(new Consumer<AggregatorSpec>() { // 32
//
// @Override
// public void accept(AggregatorSpec aggregatorSpec) {
// aggregatorSpec.processor(locateRequestProcessor, null); // 33
// }
//
// }, null)
// .transform(locateIncomingResultTransformer)
// .transform(locateExceptionReportWritingHandler)
.channel(locateIncomingCompleteChannel())
.get();
}