Spring Integration Aggregator - ReleaseStrategy - 释放资源

时间:2015-11-16 14:12:35

标签: spring-integration

这是如何释放ReleaseStrategy中使用的资源的一般问题。 我指的是提交的响应here例如 - 我想知道如果出现问题,清理地图中使用的地图的建议策略是什么:

private final Map<Object, AtomicInteger>() map = new HashMap<>();

使用案例:收到了1000组消息中的990条(或者参考示例中的9条消息中的9条),但随后超时(我们对部分结果不感兴趣)...您将如何清除地图值对于这个特定的groupId或一般情况:释放ReleaseStrategy中使用的任何其他资源的最佳方法是什么?

我正在考虑一些过期的地图或者可能从外部触发bean cleanUp方法......但也许有一些建议的方法来处理这些情况?

在groupTimeout的情况下,也许我没有得到ReleaseStrategy的工作原理,所以我有以下示例配置:

group-timeout="1000" discard-channel="discardChannel" 
end-partial-result-on-expiry="false" release-strategy="xxx"

假设我有一组由分割器生成的10条消息,每条消息实际上是由线程池执行器完成的一些工作。因此,如果作业执行池的任何(比如第二个作业)花费的时间超过指定的组超时,则此特定消息将被发送到discardChannel,但也将调用ReleaseStrategy,对吧?

但是在这种情况下,我是否仍然在该丢弃的消息中更新了MessageGroup?我假设没有 - 所以canRelease方法调用可以大于group.getMessages()。size(),对吧?

现在发生了什么?在超时之前收到的这条消息是什么?这种情况我仍然可以决定是否要发布MessageGroup中的这条消息? 对于剩余的8条消息(作业),在丢弃来自组的第二条消息之后它们是否属于新的groupId(我假设默认情况下expire-groups-upon-timeout设置为true),所以这8条消息得到了一个新的groupId,也被发送到ReleaseStrategy?

其他问题是当canRelease方法仅返回false(具有上述配置)时会发生什么 - 我注意到虽然我得到如下信息:

Expiring MessageGroup with correlationKey[36293c73-6f66-4a1a-8824-9d5268e07081]
Expiring MessageGroup with correlationKey[36293c73-6f66-4a1a-8824-9d5268e07081]
在这种情况下,

消息被“返回”到ServiceActivator(作业执行程序池bean)?所以在这种情况下它会一次又一次地执行,所以我无法退出工作流程?

1 个答案:

答案 0 :(得分:1)

通常情况下,我会在地图内容中加入某种时间戳,并安排一些任务以便经常清理它。

修改

只要新邮件到达并已添加到组中,就会调用发布策略。如果该组未被释放并且超时,则再次调用该释放策略,因此它可以决定是否释放该组。如果是,则与不释放sendPartialGroupOnExpiry为真的组相同。如果它返回false(在超时时),则根据sendPartialGroupOnExpiry丢弃或释放该组。

默认情况下,

expireGroupsUponTimeout为true,这意味着后期消息将形成一个新组,并且将为每条消息调用发布策略。如果您希望丢弃延迟消息,请将其设置为false;保留该组(零消息),因此我们知道我们需要丢弃迟到的人。

在这种情况下,发布策略将为后期消息调用,它们会立即被丢弃。

您可以通过检查组的大小轻松清除超时状态 - 如果它与上次相同,则该组即将过期。

对于长时间运行的系统,您最终可能希望使用消息组存储收割机使空组到期。