Spring Integration Aggregator - ReleaseStrategy - 释放资源
Spring Integration Aggregator - ReleaseStrategy - releasing resources
这是一个关于如何释放ReleaseStrategy中使用的资源的一般性问题。
例如,我指的是提交的响应 - 我想知道如果出现问题,清理示例中使用的地图的推荐策略是什么:
private final Map<Object, AtomicInteger>() map = new HashMap<>();
用例:收到了 1000 条群组消息中的 990 条(或参考示例中的 10 条中的 9 条),但随后超时(我们对部分结果不感兴趣)...您将如何清理映射此特定 groupId 的值或一般情况:释放 ReleaseStrategy 中使用的任何其他资源的最佳方法是什么?
我在考虑一些过期的映射或者可能从外部触发 bean cleanUp 方法...但也许有一些建议的方法来处理这些情况?
也许我不知道 ReleaseStrategy 在 groupTimeout 的情况下是如何工作的,所以我有下面的示例配置:
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 方法 returns 仅为 false(具有上述配置)时会发生什么 - 我注意到虽然我得到如下信息:
Expiring MessageGroup with correlationKey[36293c73-6f66-4a1a-8824-9d5268e07081]
Expiring MessageGroup with correlationKey[36293c73-6f66-4a1a-8824-9d5268e07081]
在这种情况下,消息 "being returned" 到 ServiceActivator(作业执行器池 bean)?所以在这种情况下它会一次又一次地执行,所以我无法退出工作流程?
通常,我会在地图内容中包含某种时间戳,并安排一些任务来经常清理它。
编辑
只要有新消息到达并已添加到组中,就会调用发布策略。如果组没有释放超时,释放策略会再调用一次,决定是否释放组。如果是,这与不释放 sendPartialGroupOnExpiry
true 的组相同。如果它 returns false(超时),该组将被丢弃或释放,基于 sendPartialGroupOnExpiry
.
expireGroupsUponTimeout
默认为真,即迟到的消息会组成一个新的分组,每条消息都会调用释放策略。如果您想丢弃迟到的消息,请将其设置为 false
;该组被保留(消息为零)所以我们知道我们需要丢弃迟到者。
在这种情况下,发布策略将不会为迟到的消息调用,它们会被立即丢弃。
您可以通过检查组的大小轻松清理超时状态 - 如果与上次相同,则该组已过期。
对于长 运行 系统,您可能希望最终使用消息组存储收割器使空组过期。
这是一个关于如何释放ReleaseStrategy中使用的资源的一般性问题。
例如,我指的是提交的响应
private final Map<Object, AtomicInteger>() map = new HashMap<>();
用例:收到了 1000 条群组消息中的 990 条(或参考示例中的 10 条中的 9 条),但随后超时(我们对部分结果不感兴趣)...您将如何清理映射此特定 groupId 的值或一般情况:释放 ReleaseStrategy 中使用的任何其他资源的最佳方法是什么?
我在考虑一些过期的映射或者可能从外部触发 bean cleanUp 方法...但也许有一些建议的方法来处理这些情况?
也许我不知道 ReleaseStrategy 在 groupTimeout 的情况下是如何工作的,所以我有下面的示例配置:
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 方法 returns 仅为 false(具有上述配置)时会发生什么 - 我注意到虽然我得到如下信息:
Expiring MessageGroup with correlationKey[36293c73-6f66-4a1a-8824-9d5268e07081]
Expiring MessageGroup with correlationKey[36293c73-6f66-4a1a-8824-9d5268e07081]
在这种情况下,消息 "being returned" 到 ServiceActivator(作业执行器池 bean)?所以在这种情况下它会一次又一次地执行,所以我无法退出工作流程?
通常,我会在地图内容中包含某种时间戳,并安排一些任务来经常清理它。
编辑
只要有新消息到达并已添加到组中,就会调用发布策略。如果组没有释放超时,释放策略会再调用一次,决定是否释放组。如果是,这与不释放 sendPartialGroupOnExpiry
true 的组相同。如果它 returns false(超时),该组将被丢弃或释放,基于 sendPartialGroupOnExpiry
.
expireGroupsUponTimeout
默认为真,即迟到的消息会组成一个新的分组,每条消息都会调用释放策略。如果您想丢弃迟到的消息,请将其设置为 false
;该组被保留(消息为零)所以我们知道我们需要丢弃迟到者。
在这种情况下,发布策略将不会为迟到的消息调用,它们会被立即丢弃。
您可以通过检查组的大小轻松清理超时状态 - 如果与上次相同,则该组已过期。
对于长 运行 系统,您可能希望最终使用消息组存储收割器使空组过期。