我使用 Poller 跟踪 InboundChannelAdapter 以每 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();
}