2014-05-01 2 views
0

Наша система обрабатывает сообщения, отправленные из системы обмена сообщениями. Если сообщение не получено через 10 секунд, следует вызвать ошибку (таймаут неактивности).Внедрение таймаута бездействия с помощью ScheduledExecutorService

Я думал об использовании ScheduledExecutorService (с 1 потоком). Каждый раз, когда получено сообщение, я отменить предыдущую задачу тайм-аута и представить новый:

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

... 

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

В нормальном случае, мы обрабатываем ~ 1000/сек. Будет ли этот подход масштабироваться?

ответ

0

Если вы разделяете threadpool и поддерживаете время ожидания timeoutTask низким, это было бы, скорее всего, прекрасно. Если бы у вас был один threadpool за 1000/сек задач, это не сработало бы.

Если вы все еще беспокоитесь, вы можете посмотреть HashedWheelTimer из проекта Netty (link). Эта вещь очень эффективна при планировании тайм-аутов. Обратите внимание, что вы ДОЛЖНЫ совместно использовать экземпляр HashedWheelTimer.

Смежные вопросы