Spring Integration Aggregator组超时值问题

时间:2018-01-12 16:38:45

标签: spring-integration

我们正在使用Spring Integration 4.2.3聚合器组件和定义的组超时,并期望在给定的超时值内对组进行超时,同时向组和组添加消息。发布大小标准未得到满足。

但是我们看到不同的结果,当我们向服务输入大量负载时,聚合器正在等待所有要添加到组的消息,而不是在超时达到时使组到期。

有没有办法覆盖聚合器功能,以便在超时组时查看第一条消息而不是最后一条消息。

以下是我们的聚合器配置。

<int:aggregator id="adobeJdbcAggregator" input-channel="adobePubSubChannel" 
                                             output-channel="aggregatorOuputChannel"
                                             correlation-strategy-expression="headers['eventType']" 
                                             message-store="ccsJdbcMessageStore" 
                                             send-partial-result-on-expiry="true" 
                                             group-timeout-expression="10000"
                                             expire-groups-upon-completion="true"
                                             expire-groups-upon-timeout="true" 
                                             release-strategy-expression="size() ==100"
                                             ref="ccsAggregatorBean" 
                                             method="processMessage"  
                                             auto-startup="true"/>

3 个答案:

答案 0 :(得分:2)

嗯,实际上即使你现在也可以做你需要的。使用相同的group-timeout-expression。但是,您必须参考评估上下文的#root对象,这正是您所需要的 - MessageGroup。有了这个,你可以打电话给你:

/**
 * @return the timestamp (milliseconds since epoch) associated with the creation of this group
 */
long getTimestamp();

/**
 * @return the timestamp (milliseconds since epoch) associated with the time this group was last updated
 */
long getLastModified();

因此,原始请求的表达式可能如下:

group-timeout-expression="timestamp + 10000 - T(System).currentTimeMillis()"

我们得到调整后的超时,该超时将应用于计划任务,其值为:new Date(System.currentTimeMillis() + groupTimeout));

答案 1 :(得分:0)

没有;超时当前仅基于最后一条消息的到达。

如果您改为使用MessageGroupStoreReaper,则时间默认基于组创建,但可以通过将组存储的timeoutOnIdle设置为true来更改。

如果您的组根本没有超时,则默认taskScheduler中的线程池可能已耗尽 - 默认情况下它只有10个线程。

您可以增加池大小或将专用调度程序注入聚合器。

答案 2 :(得分:0)

我们使用您的group-timeout-expression(timestamp + 20000 - T(System).currentTimeMillis())调试了该问题,并发现表达式在消息继续流入后评估为负值,从而导致该组永远不会被释放。

问题在AbstractCorrelatingMessageHandler.java

中的代码块

enter image description here

一旦我们删除了&#34; groupTimeout >= 0&#34;的条件,现在该组因为else阻止而过期。现在代码的行为与我们的预期相符。

你可以告诉我为什么当它达到负值时你不会强迫该组成为timedoout吗?