Должен быть механизм, ограничивающий длительность исполнения агентов. Например, может быть важно, чтобы работа агента не наложилась на начало рабочего дня. Слишком долгое исполнение нескольких агентов может привести к не возможности активировать других агентов и т.п.
Для этих целей в НЗ администратор может наложить квоты по длительности. Квота определяется либо в виде длительности в секундах (для ASAP и Delayed), либо в виде фиксированного времени завершения работы "группы агентов" (для агентов по-расписанию)
Лимит должен отслеживать КМА. При исчерпании квоты, КМА должен инициировать прерывание выполнения агента.
Для этого надо вызвать Future.cancel(true) для задачи, исполняющей агента в пуле потоков. Данный вызов взведет в потоке, исполняющем задачу флаг прерывания (Thread.currentThread.isInterrupted()), а также прервет ожидание на операциях межпоточной синхронизации (wait, join и т.п.) с выбросом InterruptedException. Но InterruptedException выбросится только если поток находился в выполнении одной из этих операций. Поэтому агент должен ещё периодически вызывать AgentContext.checkCancelation(), который при наличии флага прерывания должен бросить InterruptedException.
if (Thread.currentThread.isInterrupted()) throw new InterruptedException(); |
Аналогичную проверку должен делать и итератор JMS-сообщений с данными на вызовах next() и hasNext()
InterruptedException также может быть выброшен и при аккуратной остановке сервера (через ExecutorService.shutdownNow()). В обоих случаях задача в пуле потоков, получившая такое исключение, должна завершить исполнение.