Бесконечный цикл с режимом ожидания потока против 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.

Другие вопросы по тегам