使用ScheduledExecutorService实现不活动超时

时间:2014-05-01 07:57:25

标签: concurrency future scheduledexecutorservice

我们的系统处理来自邮件系统的邮件。如果10秒后未收到任何消息,则应引发错误(不活动超时)。

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

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

...

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

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

1 个答案:

答案 0 :(得分:0)

如果你共享线程池并将timeoutTask的运行时间保持在低水平,那么它很可能会很好。如果你有每个~1000 /秒任务的一个线程池那么那就行不通了。

如果您仍然担心,可以查看Netty项目中的HashedWheelTimerlink)。这个事情在调度超时方面非常有效。请注意,您还必须共享HashedWheelTimer的实例。