Java:一种用于重复数据消除的延时队列
大家好 我有一个系统(源),它需要在某些对象发生更改时异步通知另一个系统(目标)。问题在于,源系统可能会在短时间内多次改变单个对象(更新非常“突发”),在这种情况下,最好只通知目标系统一次,并通知对象的最终状态 我的想法是在ThreadPoolExecutor前面使用某种延时的重复数据消除队列。此队列将:Java:一种用于重复数据消除的延时队列,java,concurrency,queue,timedelay,deduplication,Java,Concurrency,Queue,Timedelay,Deduplication,大家好 我有一个系统(源),它需要在某些对象发生更改时异步通知另一个系统(目标)。问题在于,源系统可能会在短时间内多次改变单个对象(更新非常“突发”),在这种情况下,最好只通知目标系统一次,并通知对象的最终状态 我的想法是在ThreadPoolExecutor前面使用某种延时的重复数据消除队列。此队列将: 将项目保留在队列中的时间最短(理想情况下,配置为比典型突变突发的持续时间长一点点) 在重复项(由对象的标识符定义)排队时替换现有对象。但是,该项目应保留其在队列中的原始位置(以避免任何一个项目
另外,我知道ESB会做这种事情,但在这种情况下,这种方法太重了——理想情况下,我根本不想向源系统添加任何新的库依赖项。您可以只通知系统发生了更改,然后让另一个系统获取新状态。然后,在获取状态之前不要通知进一步的更改。我认为最好的办法是扩展
ArrayBlockingQueue
并覆盖offer
和poll
以添加延时功能。
尤其是ArrayBlockingQueue
,因为它有一个contains
方法
另一个想法是使用DelayQueue
覆盖offer
,删除旧元素并插入新元素,但保留旧的时间延迟,这将基本上保持顺序。
然后,您需要将队列项目包装在一个
延迟的界面中。谢谢。有没有想过直接实现BlockingQueue
,但授权给内部ArrayBlockingQueue
实例,在offer
和poll
方法中使用一些额外的逻辑?我总是对扩展核心JDK类有点怀疑——所以很多类的设计都没有考虑到这一点(特别是在java.util.concurrent中,因为我在那里的探索有限)。在这种情况下,扩展和实现+内部的区别在于使用this
/super
和myBlockingQueue
作为队列对象之间的区别,因此这是一个品味问题。现在我想一想,DelayQueue
的想法可能会更简单。我认为最棘手的部分是在队列中更新队列的元素,如果使用ArrayBlockingQueue
,可能需要使用迭代器进入队列,或者保留类似于ArrayList
的引用,以便轻松访问对象。使用DelayQueue
只需remove
、match expiration time和offer
。感谢软件Monkey,但我认为这会将原来的问题转化为更大的问题,即必须跟踪潜在数百万对象的单个“检索状态”。