Java:一种用于重复数据消除的延时队列

Java:一种用于重复数据消除的延时队列,java,concurrency,queue,timedelay,deduplication,Java,Concurrency,Queue,Timedelay,Deduplication,大家好 我有一个系统(源),它需要在某些对象发生更改时异步通知另一个系统(目标)。问题在于,源系统可能会在短时间内多次改变单个对象(更新非常“突发”),在这种情况下,最好只通知目标系统一次,并通知对象的最终状态 我的想法是在ThreadPoolExecutor前面使用某种延时的重复数据消除队列。此队列将: 将项目保留在队列中的时间最短(理想情况下,配置为比典型突变突发的持续时间长一点点) 在重复项(由对象的标识符定义)排队时替换现有对象。但是,该项目应保留其在队列中的原始位置(以避免任何一个项目

大家好

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

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

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

  • 在重复项(由对象的标识符定义)排队时替换现有对象。但是,该项目应保留其在队列中的原始位置(以避免任何一个项目永久性地撞到队列的后面-在某个时刻,我们需要发送通知,即使另一个项目随时会出现)

  • 我在java.util中没有看到任何与此完全相同的内容,我的google fu在这方面似乎特别薄弱

    以前是否有人实现过此功能,是否知道这种行为的BlockingQueue实现,或者有关于如何实现的提示

    提前谢谢

    彼得


    另外,我知道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,但我认为这会将原来的问题转化为更大的问题,即必须跟踪潜在数百万对象的单个“检索状态”。