0

我们的系统处理从消息传递系统传递的消息。如果 10 秒后未收到消息,则应引发错误(不活动超时)。

我正在考虑使用ScheduledExecutorService(带 1 个线程)。每次收到消息,我都会取消之前的超时任务并提交一个新的:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Callable timeoutTask = new Callable() {...};

...

synchronized {
    timeout.cancel();
    timeout = executor.schedule( timeoutTask, 10, TimeUnit.SECONDS);
}

在正常情况下,我们处理 ~ 1000 / 秒。这种方法会扩展吗?

4

1 回答 1

0

如果您共享线程池并保持 timeoutTask 的运行时间较低,那很可能没问题。如果您每约 1000 个/秒的任务有一个线程池,那么这将行不通。

如果您仍然担心,可以HashedWheelTimer从 Netty 项目(链接)中查看。这件事在安排超时方面非常有效。请注意,您也必须共享实例HashedWheelTimer

于 2014-05-01T08:18:29.670 回答