Java 我应该使用什么样的数据结构来实现下一种调度的剩余最短到期时间

Java 我应该使用什么样的数据结构来实现下一种调度的剩余最短到期时间,java,data-structures,queue,message-queue,priority-queue,Java,Data Structures,Queue,Message Queue,Priority Queue,我将得到特定类型的物品。每种类型都有与之关联的到期期限。在继续对每个项目进行处理之前,每个项目的保存期限指定为与其类型关联的到期期限 例如,Type1项目在10秒后过期,而Type2项目在5秒后过期。现在考虑Type 1 ITEM1在时间1出现。所以它应该在时间11执行。现在考虑我在时间2得到Type 2 ITEM2。所以它应该在时间7执行。现在考虑我在时间3得到另一个Type 2 ITEM3。所以它应该在时间8执行。所以最后的执行命令是 项目2在时间7 项目3在时间8 项目1在时间11 我

我将得到特定类型的物品。每种类型都有与之关联的到期期限。在继续对每个项目进行处理之前,每个项目的保存期限指定为与其类型关联的到期期限

例如,Type1项目在10秒后过期,而Type2项目在5秒后过期。现在考虑Type 1 ITEM1在时间1出现。所以它应该在时间11执行。现在考虑我在时间2得到Type 2 ITEM2。所以它应该在时间7执行。现在考虑我在时间3得到另一个Type 2 ITEM3。所以它应该在时间8执行。所以最后的执行命令是

  • 项目2在时间7
  • 项目3在时间8
  • 项目1在时间11
我应该使用什么数据结构来模拟这种行为?基本上,它看起来像优先级队列,总是将下一个要处理的项目保持在其头部。是否有任何现成的队列服务器可以自动执行此操作。我已经广泛使用卡夫卡,但它似乎并没有很好地达到这个目的。还有其他选择吗?还是应该选择普通Java优先级队列?或者我应该寻找与队列完全不同的方法吗

更新

  • 忘了提到我可能有很多类型

  • 使用a来解决这个确切的用例

    使用a来解决这个确切的用例

    你是对的,卡夫卡在开箱即用的实现方面并不适合这个用例

    消息顺序保留在分区中,这样就可以保留带有时间戳的到达顺序(您也可以将其添加为字段)。就实施优先权而言,利用上面提供的基础知识来实现这一点应该不会太难


    排队技术倾向于实现消息传递服务,而您的用例更面向处理。也许可以看看一些处理框架,如ApacheSpark或ApacheStorm。

    您是对的,Kafka在开箱即用的实现方面并不适合这种情况

    消息顺序保留在分区中,这样就可以保留带有时间戳的到达顺序(您也可以将其添加为字段)。就实施优先权而言,利用上面提供的基础知识来实现这一点应该不会太难


    排队技术倾向于实现消息传递服务,而您的用例更面向处理。请看一些处理框架,如ApacheSpark或ApacheStorm。

    您不喜欢优先级队列的哪些方面?您也可以使用保存执行时间/项目的
    TreeMap
    (假设没有两个项目同时执行)?是否要存储这些类型以供将来使用?或者您只想在给定的时间段后执行它们?如果您要求晚一点,我建议您选择“Executors.newSingleThreadScheduledExecutor()”,然后提交具有所需时间延迟的任务。您查看了DelayQueue吗?@assylias TreeMap听起来不错,但不能保证唯一的执行时间…猜测解决方法…还有一些消息服务器支持延迟消息传递模式,我想到了ActiveMQ和RabbitMQ,但我有点生疏。将把研究留给您,看看它是否适用于您的环境-例如:您不喜欢优先级队列的哪些方面?您也可以使用保存执行时间/项目的
    TreeMap
    (假设没有两个项目同时执行)?是否要存储这些类型以供将来使用?或者您只想在给定的时间段后执行它们?如果您要求晚一点,我建议您选择“Executors.newSingleThreadScheduledExecutor()”,然后提交具有所需时间延迟的任务。您查看了DelayQueue吗?@assylias TreeMap听起来不错,但不能保证唯一的执行时间…猜测解决方法…还有一些消息服务器支持延迟消息传递模式,我想到了ActiveMQ和RabbitMQ,但我有点生疏。将研究留给您,以确定其是否适用于您的环境-例如: