Бесконечный цикл с режимом ожидания потока против EJB 3.1 Таймеры в WebSphere 8: противодавление
У меня есть требование к
- читать таблицу базы данных
- обработать данные (dataCleanser)
Чтобы увеличить пропускную способность, я внедрил таймеры EJB(непостоянные), которые включаются каждые 5 минут (10 из них) и выполняют вышеуказанную работу.
Проблема в "обратном давлении", dataCleanser иногда может занять около 12 минут (вызов внешнего API), и когда это происходит, Websphere сообщает о зависании потока.
В этих случаях я хотел бы уменьшить количество таймеров (скажем, с 10 до 5) программно. Я могу сделать это только в том случае, если таймер возвращается и сообщает о состоянии успешного выполнения, исключении или тайм-ауте.
таким образом я могу контролировать обратное давление.is there anyway to do that in Websphere 8?
Задать вопрос по-другому
- can the EJB timers(with transaction_not_supported) invoke another EJB that have transaction timeouts?
- can those timeouts be caught in the calling timer code?
если это невозможно, каковы недостатки использования простого старого бесконечного цикла с sleep, а затем вызова и EJB(в свою очередь вызывает dataCleanser) с тайм-аутом транзакции?
Один из недостатков, я знаю, это то, что это становится однопоточным, и я не делаю 10 параллельных выполнений, как я бы делал с таймерами.
1 ответ
У меня были некоторые похожие проблемы с планированием, я решил перепланировать обратные вызовы программно каждый раз, когда моя логика заканчивалась, основываясь на результатах обработки. Вы можете использовать сервис таймера:
@Resource
private TimerService timerService;
Это может быть в суперклассе, если есть несколько EJB-компонентов, которые требуют планирования, с помощью таких методов:
protected void reschedule(long millis) {
timerService.createTimer(millis, null);
}
Таким образом, вы можете контролировать бобы индивидуально. Я бы не стал пытаться заставить их контролировать друг друга, так как это будет сложно в кластере с несколькими JVM.