Ответ 1
Я считаю, что вы наблюдаете за контейнером, пытающимся повторить неудачный вызов doWork()
.
Служба таймера EJB является транзакционной.
Если выполнение метода тайм-аута выбрасывает исключение во время выполнения, транзакция будет отброшена назад, и контейнер попытается снова выполнить метод тайм-аута. См. §18.2.8. Транзакции спецификации EJB 3.1.
Кроме того, если истекает время ожидания транзакции, некоторые реализации просто отметят текущую транзакцию для отката и продолжат обработку. Это приведет к сбою вызова таймера, и попытка повторения будет предпринята.
Этот механизм повторения недостаточно определен, и фактическое поведение варьируется от реализации к реализации. Некоторые вернутся навсегда, а другие будут сдаваться после нескольких попыток. Например, WebSphere предоставляет способ указания стратегии повтора. См. Создание таймеров с использованием службы таймера EJB для предприятия beans.
Наконец, если ваше приложение работает на нескольких узлах, вы, вероятно, используете таймер для экземпляра сервера. Согласно §18.2.3 Непостоянные таймеры спецификации:
Для автоматических нестационарных таймеров контейнер создает новый непостоянный таймер во время инициализации приложения для каждой JVM, через которую распространяется контейнер.
Если все они выполняют одну и ту же задачу, это может вызвать достаточный хаос для генерации ошибок, откатов и последующих попыток.