Это должно быть действительно легко. Я использую Кварц, работающий под Tomcat Apache 6.0.18, и у меня есть файл jobs.xml, который настраивает мое запланированное задание, которое работает каждую минуту.
То, что я хотел бы сделать, то, если задание все еще работает, когда следующий триггерный раз наступает, я не хочу запускать новое задание, таким образом, я могу позволить старому экземпляру завершиться.
Существует ли способ указать это в jobs.xml (предотвратите параллельные экземпляры)?
В противном случае существует ли способ, которым я могу совместно использовать доступ к одиночному элементу в оперативной памяти в рамках реализации Job моего приложения (это через JobExecutionContext?), таким образом, я могу обработать параллелизм сам? (и обнаружьте, если предыдущий экземпляр работает),
обновление: После выпутывания в документах вот несколько подходов, которые я рассматриваю, но или не знаю, как заставить их работать, или существуют проблемы.
Используйте 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, чтобы заставить это прокладывать себе путь, я хочу, таким образом, я не вижу большую часть преимущества для использования его.
Используйте TriggerListener для возвращения true от vetoJobExecution ().
Хотя реализация интерфейса кажется простой, я должен выяснить, как установить один экземпляр TriggerListener декларативно. Не может найти документы для XML-файла.
Используйте a static
общий ориентированный на многопотоковое исполнение объект (например, семафор или безотносительно) принадлежавший моему классу, который реализует Job.
Мне не нравится идея использовать одиночные элементы через static
ключевое слово под Tomcat/Кварцем, не уверенным, если существуют побочные эффекты. Также я действительно не хочу, чтобы они были истинными одиночными элементами, просто что-то, что связано с конкретным определением задания.
Реализуйте мой собственный Триггер, который расширяет SimpleTrigger и содержит общее состояние, которое могло выполнить его собственный TriggerListener.
Снова, я не знаю, как установить XML-файл для использования этого триггера, а не стандарта
.
когда ваша работа 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
}
Я сделал нечто подобное, заставив мои классы заданий реализовать StatefulJob , который гарантирует, что никакие другие задания не будут запущены до завершения текущего выполняющегося задания.
Надеюсь, что это поможет;)
PD: Я реализовал это с помощью JBoss ... но я не думаю, что это имеет значение.