6

大家好,

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

我的想法是为此在 ThreadPoolExecutor 前面使用某种延时、重复数据删除队列。该队列将:

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

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

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

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

提前致谢!

彼得

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

4

2 回答 2

4

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

另一个想法是DelayQueue您覆盖offer以删除旧元素并插入新元素但保留旧的时间延迟,这基本上会保留顺序。然后你需要将你的队列项目包装在一个Delayed界面中。

于 2011-05-29T06:27:54.947 回答
0

您可以只通知系统发生了更改,并让其他系统获取新状态。然后在获取状态之前不要通知进一步的更改。

于 2011-05-29T06:22:28.513 回答