Увеличьте время ожидания запланированного задания в Thorntail - PullRequest
0 голосов
/ 01 октября 2019

Я пишу запланированное задание в 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 = нулевой интервалDuration (в миллисекундах) = 0 nextExpiration = Tue01 октября 16:20:00 CEST 2019 timerState = IN_TIMEOUT info = null] будет повторен

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

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

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

1 Ответ

1 голос
/ 17 октября 2019

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

Запланированная задача распределяет задания между асинхронно выполняющимися сеансными компонентами без сохранения состояния (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 : другой подходиспользовать API пакетной обработки Java (JSR 352), к сожалению, я не знаком с этим API.

...