[英]Spring Integration timeout with Aggregator in memory
我注意到(代码反编译),当在聚集器上设置超时时,整个消息组将存储在将来的内存中而不是存储中。 当高吞吐量发生时,这有时会导致“内存不足”异常。
有没有更好的方法来解决这个问题?
<aggregator input-channel="orderNotificationLoadBalancedExecutorChannelLATAM" output-channel="orderNotificationConverterChannelLATAM"
message-store="orderNotificationGroupStoreLATAM"
send-partial-result-on-expiry="true"
ref="firstOnlyPrimaryKeyMessageAggregator"
method="aggregate"
correlation-strategy-expression="headers['erpKeyMap']['erpKey']"
release-strategy-expression="#this[0].headers['tableName'].topLevel and #this[0].headers['operationType'].operationTypeDelete"
expire-groups-upon-completion="true"
expire-groups-upon-timeout="true"
group-timeout="5000">
</aggregator>
哎呀!
看起来像个错误。 我刚刚就此事提出了JIRA 。
有罪代码如下:
private void scheduleGroupToForceComplete(final MessageGroup messageGroup) {
...
ScheduledFuture<?> scheduledFuture = this.getTaskScheduler()
.schedule(new Runnable() {
@Override
public void run() {
try {
forceReleaseProcessor.processMessageGroup(messageGroup);
}
catch (MessageDeliveryException e) {
if (logger.isDebugEnabled()) {
logger.debug("The MessageGroup [ " + messageGroup +
"] is rescheduled by the reason: " + e.getMessage());
}
scheduleGroupToForceComplete(messageGroup);
}
}
}, new Date(System.currentTimeMillis() + groupTimeout));
因此, ScheduledFuture
通过该内联Runnable
回调保存对final MessageGroup
的引用。
我认为我们将仅使用groupId
对其进行修复。
抱歉,没有任何解决方法...
您可以设置消息存储。 看到这里 。
- 对MessageGroupStore的引用,用于将消息组存储在它们的关联键下,直到它们完成为止。 可选,默认情况下是易失的内存存储。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.