G'day大家,
我有一个系统(源)需要在某些对象发生变化时异步通知另一个系统(目标)。扭曲是源系统可能在短时间内多次突变单个对象(更新非常“突发”),在这种情况下,理想的情况是仅通知目标系统一次,并且最终状态为对象
我的想法是在ThreadPoolExecutor前面使用某种延时的重复数据删除队列。这个队列将:
将项目保留在队列中的时间最短(理想情况下配置为仅比典型突发突发的持续时间长的smidgin)
在重复(由对象的标识符定义)入队的情况下替换现有对象。但是,该项目应该保留在队列中的原始位置(以避免任何一个项目永久地碰到队列的后面 - 在某些时候我们需要发送通知,即使另一个项目将暂时出现)。
我在java.util中没有看到任何与此完全相同的东西,而且我在这方面的google-fu似乎特别弱。
有没有人以前实现过这个,知道一个行为方式的BlockingQueue实现,或者有关于如何实现它的提示?
提前致谢!
彼得
PS。我知道ESB会做这种事情,但在这种情况下,这种方法太重了 - 理想情况下我根本不想在源系统中添加任何新的库依赖项。
答案 0 :(得分:4)
我认为最好的办法是扩展ArrayBlockingQueue
并覆盖offer
和poll
以添加延时功能。
特别是ArrayBlockingQueue
,因为它有contains
方法。
另一个想法是DelayQueue
,您可以覆盖offer
以删除旧元素并插入新元素但保留旧时间延迟,这将基本上保留顺序。
然后,您需要将队列项包装在Delayed
界面中。
答案 1 :(得分:0)
您只能通知系统发生了更改,并让其他系统获取新状态。然后在获取状态之前不要通知进一步的更改。