【发布时间】:2017-05-16 16:16:50
【问题描述】:
我将获得特定类型的物品。每种类型都有与之关联的有效期。在继续对其进行处理之前,每个项目都会保留指定为与其类型关联的到期持续时间的持续时间。
例如,Type1 项目在 10 秒后过期,而 Type2 项目在 5 秒后过期。现在考虑 Type1 item1 在时间 1 出现。所以它应该在时间 11 执行。现在考虑我在时间 2 得到 Type2 item2。所以它应该在时间 7 执行。现在考虑我在时间 3 得到另一个 Type2 item3。所以它应该在时间 8 执行。所以最终的执行顺序是
- item2 在时间 7
- item3 在时间 8
- item1 在时间 11
我应该使用什么数据结构来模拟这种行为?首先,它看起来像优先级队列,它始终将要处理的项目保持在其头部。是否有任何现成的队列服务器可以自动执行此操作。我已经广泛使用了 kafka,但它似乎不能很好地服务于这个目的。还有其他选择吗?还是应该选择普通的 Java 优先级队列?还是我应该寻找与队列完全不同的方法?
更新
- 忘了说我可能有很多类型。
【问题讨论】:
-
您不喜欢优先级队列的哪些方面?您也可以使用保存执行时间/项目的
TreeMap<Instant, Item>(假设没有两个项目同时执行)? -
您想存储这些类型以备将来使用吗?或者你只是想在给定的时间段后执行它们?如果稍后是您的要求,我建议您使用“Executors.newSingleThreadScheduledExecutor()”,然后按照您所需的时间延迟提交任务。
-
你看DelayQueue了吗?
-
@assylias TreeMap 听起来不错,但不能保证唯一的执行时间...猜测解决方法...
-
还有一些消息服务器支持延迟消息传递模式,我想到了 ActiveMQ 和 RabbitMQ 但我有点生疏了。将把研究留给您,看看它是否适用于您的环境 - 例如:activemq.apache.org/delay-and-schedule-message-delivery.html
标签: java data-structures queue message-queue priority-queue