gpt4 book ai didi

Java:一个去重的延时队列

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:23:05 24 4
gpt4 key购买 nike

大家好,

我有一个系统(源)需要在某些对象发生变化时异步通知另一个系统(目标)。不同之处在于,源系统可能会在短时间内多次改变单个对象(更新非常“突发”),在这种情况下,理想的情况是只通知目标系统一次,并通知目标系统的最终状态对象。

我的想法是为此在 ThreadPoolExecutor 之前使用某种时间延迟的重复数据删除队列。这个队列将:

  1. 将项目保留在队列中的时间最短(理想情况下配置为比典型突变爆发的持续时间稍长)

  2. 如果重复项(由对象的标识符定义)入队,则替换现有对象。然而,该项目应该保留其在队列中的原始位置(以避免任何一个项目永远被撞到队列的后面 - 在某些时候我们需要发送通知,即使另一个项目会暂时出现)。

我在 java.util 中没有看到完全像这样的东西,而且我在这方面的 google-fu 似乎特别薄弱。

有没有人以前实现过这个,知道 BlockingQueue 实现以这种方式运行,或者有关于如何实现一个的提示?

提前致谢!

彼得

附言。我知道 ESB 会做这种事情,但在这种情况下,这是一种过于重量级的方法 - 理想情况下,我根本不想向源系统添加任何新的库依赖项。

最佳答案

我认为最好的选择是扩展 ArrayBlockingQueue 并覆盖 offerpoll 以添加时间延迟功能。特别是 ArrayBlockingQueue,因为它有一个 contains 方法。

另一个想法是 DelayQueue,您可以在其中覆盖 offer 以移除旧元素并插入新元素,但保留旧时间延迟,这将基本上保持顺序。然后,您需要将队列项包装在 Delayed 接口(interface)中。

关于Java:一个去重的延时队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6166238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com