кварц: предотвращение параллельных экземпляров задания в jobs.xml

Это должно быть действительно легко. Я использую Кварц, работающий под Tomcat Apache 6.0.18, и у меня есть файл jobs.xml, который настраивает мое запланированное задание, которое работает каждую минуту.

То, что я хотел бы сделать, то, если задание все еще работает, когда следующий триггерный раз наступает, я не хочу запускать новое задание, таким образом, я могу позволить старому экземпляру завершиться.

Существует ли способ указать это в jobs.xml (предотвратите параллельные экземпляры)?

В противном случае существует ли способ, которым я могу совместно использовать доступ к одиночному элементу в оперативной памяти в рамках реализации Job моего приложения (это через JobExecutionContext?), таким образом, я могу обработать параллелизм сам? (и обнаружьте, если предыдущий экземпляр работает),


обновление: После выпутывания в документах вот несколько подходов, которые я рассматриваю, но или не знаю, как заставить их работать, или существуют проблемы.

  1. Используйте StatefulJob. Это предотвращает параллельный доступ..., но я не уверен, что произошли бы другие побочные эффекты, если я использую его, также я хочу избежать следующей ситуации:

    Предположим, что триггерные времена были бы каждую минуту, т.е. trigger#0 = во время 0, триггер № 1 = 60 000 мс, № 2 = 120000, № 3 = 180000, и т.д. и trigger#0 во время 0 огней мое задание, которое занимает 130 000 мс. С плоскостью Job это выполнило бы триггеры № 1 и № 2, в то время как триггер задания № 0 все еще работает. С StatefulJob это выполнило бы триггеры № 1 и № 2 в порядке, сразу после концов № 0 в 130 000. Я не хочу это, я хочу, чтобы № 1 и № 2 не работали и следующий триггер, который работает, задание должно произойти в № 3 (180 000 мс). Таким образом, я все еще должен сделать что-то еще с StatefulJob, чтобы заставить это прокладывать себе путь, я хочу, таким образом, я не вижу большую часть преимущества для использования его.

  2. Используйте TriggerListener для возвращения true от vetoJobExecution ().

    Хотя реализация интерфейса кажется простой, я должен выяснить, как установить один экземпляр TriggerListener декларативно. Не может найти документы для XML-файла.

  3. Используйте a static общий ориентированный на многопотоковое исполнение объект (например, семафор или безотносительно) принадлежавший моему классу, который реализует Job.

    Мне не нравится идея использовать одиночные элементы через static ключевое слово под Tomcat/Кварцем, не уверенным, если существуют побочные эффекты. Также я действительно не хочу, чтобы они были истинными одиночными элементами, просто что-то, что связано с конкретным определением задания.

  4. Реализуйте мой собственный Триггер, который расширяет SimpleTrigger и содержит общее состояние, которое могло выполнить его собственный TriggerListener.

    Снова, я не знаю, как установить XML-файл для использования этого триггера, а не стандарта ....

42
задан Community 23 May 2017 в 12:26
поделиться

2 ответа

когда ваша работа Quartz просыпается, вы можете сделать:

JobDetail existingJobDetail = sched.getJobDetail(jobName, jobGroup);
    if (existingJobDetail != null) {
        List<JobExecutionContext> currentlyExecutingJobs = (List<JobExecutionContext>) sched.getCurrentlyExecutingJobs();
        for (JobExecutionContext jec : currentlyExecutingJobs) {
            if(existingJobDetail.equals(jec.getJobDetail())) {
                //String message = jobName + " is already running.";
                //log.info(message);
                //throw new JobExecutionException(message,false);
            }
        }
        //sched.deleteJob(jobName, jobGroup); if you want to delete the scheduled but not-currently-running job
    }
18
ответ дан 26 November 2019 в 23:25
поделиться

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

Надеюсь, что это поможет;)

PD: Я реализовал это с помощью JBoss ... но я не думаю, что это имеет значение.

5
ответ дан 26 November 2019 в 23:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: