Увеличьте время ожидания запланированной задачи в Thorntail

Я пишу запланированное задание в Thorntail, которое будет выполняться в течение длительного времени (около 30 минут). Однако похоже, что Thorntail ограничивает время выполнения 30 секундами.

Мой код выглядит так (я удалил код, который, по моему мнению, не имеет отношения к делу):

@Singleton
public class ReportJobProcessor {

    @Schedule(hour = "*", minute = "*/30", persistent = false)
    public void processJobs() {
        // Acquire a list of jobs

        jobs.forEach(this::processJob);
    }

    private void processJob(ReportJob job) {
        // A long running process
    }
}

Через 30 секунд я вижу в журналах следующее:

2019-10-01 16:15: 14,097 INFO [org.jboss.as.ejb3.timer] (EJB по умолчанию - 2) WFLYEJB0021: Таймер: [id = ... timedObjectId = ... автоспуск?: True постоянный ?: false timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@42478b98 initialExpiration = null intervalDuration (в миллисекундах) = 0 nextExpiration = вторник, 01 октября, 16:20:00 CEST 2019 timerState = IN_TIMEOUT info = null] будет повторил попытку

Еще через 30 секунд создается исключение, потому что задание все еще не завершено.

Я понятия не имею, как увеличить тайм-аут, и поиск в Google моей проблемы ничего не дает.

Как я могу увеличить тайм-аут до 30 секунд?


person Cas    schedule 01.10.2019    source источник
comment
Боюсь, что ничем не могу помочь, но я на 100% уверен, что такое поведение исходит от WildFly. Если вы можете получить помощь о том, как настроить таймеры EJB в WildFly, чтобы избежать такого поведения, скорее всего, очень легко перенести на Thorntail.   -  person Ladicek    schedule 01.10.2019


Ответы (1)


Я предлагаю вам немного другой подход.

Запланированная задача распределяет задания по асинхронно выполняющимся сессионным компонентам без сохранения состояния (SLSB), называемым ReportJobExecutor, и завершает работу сразу после распределения задания без тайм-аута. Количество одновременно работающих SLSB можно регулировать в project-defaults.yml, по умолчанию - 16, IIRC. Это очень простой пример, но он демонстрирует выполнение Java EE с предопределенным пулом компонентов, который вызывается с помощью EJB Timer. Более сложным примером может быть ручное объединение исполнителей, которое позволит вам контролировать жизненный цикл исполнителей (например, убить их по истечении заданного времени).

@Singleton
public class ReportJobProcessor {

    @Inject ReportJobExecutor reportJobExecutor;

    @Schedule(hour = "*", minute = "*/30", persistent = false)
    public void processJobs() {
        // Acquire a list of jobs

        jobs.forEach(job -> reportJobExecutor.run(job));
    }
}

@Stateless
@Asynchronous
public class ReportJobExecutor {

    public void run(ReportJob job) {
        //do whatever with job
    }
}

Идея №2. Другой подход - использовать Java Batch Processing API (JSR 352), к сожалению, я не знаком с этим API.

person Mišo Stankay    schedule 17.10.2019