Вопрос

Я использую планировщик Quartz Enterprise Job (1.8.3). Конфигурация задания поступает из нескольких файлов XML, и у нас есть специальная задача, которая обнаруживает изменения в этих файлах XML и повторно-сценулах. Это работает Денди, но проблема в том, что мне также нужна эта «работа по планированию», чтобы переосмыслить себя. Как только эта работа переосмысливает себя, по какой-то причине я вижу, что она выполняется много раз. Я не вижу никаких исключений, хотя.

Я повторил и изолировал проблему. Это будет точка входа:

public class App {
    public static void main(final String[] args) throws ParseException, SchedulerException {
    // get the scheduler from the factory
    final Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

    // start the scheduler
    scheduler.start();

    // schedule the job to run every 20 seconds
    final JobDetail jobDetail = new JobDetail("jobname", "groupname", TestJob.class);        
    final Trigger trigger = new CronTrigger("triggername", "groupname", "*/20 * * * * ?");

    // set the scheduler in the job data map, so the job can re-configure itself
    jobDetail.getJobDataMap().put("scheduler", scheduler);

    // schedule job
    scheduler.scheduleJob(jobDetail, trigger);

    }
}

И это был бы класс работы:

public class TestJob implements Job {

private final static Logger LOG = Logger.getLogger(TestJob.class);
private final static AtomicInteger jobExecutionCount = new AtomicInteger(0);

public void execute(final JobExecutionContext context) throws JobExecutionException {
    // get the scheduler from the data map
    final Scheduler scheduler = (Scheduler) context.getJobDetail().getJobDataMap().get("scheduler");
    LOG.info("running job! " + jobExecutionCount.incrementAndGet());

    // buid the job detail and trigger
    final JobDetail jobDetail = new JobDetail("jobname", "groupname", TestJob.class);
    // this time, schedule it to run every 35 secs
    final Trigger trigger;
    try {
        trigger = new CronTrigger("triggername", "groupname", "*/50 * * * * ?");
    } catch (final ParseException e) {
        throw new JobExecutionException(e);
    }
    trigger.setJobName("jobname");
    trigger.setJobGroup("groupname");

    // set the scheduler in the job data map, so this job can re-configure itself
    jobDetail.getJobDataMap().put("scheduler", scheduler);

    try {
        scheduler.rescheduleJob(trigger.getName(), jobDetail.getGroup(), trigger);
    } catch (final SchedulerException e) {
        throw new JobExecutionException(e);
    }
}
}

Я пробовал оба с scheduler.rescheduleJob и с scheduler.deleteJob тогда scheduler.scheduleJob. Анкет Независимо от того, что я делаю, это выход, который я получаю (я использую log4j):

23:22:15,874         INFO SchedulerSignalerImpl:60 - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
23:22:15,878         INFO QuartzScheduler:219 - Quartz Scheduler v.1.8.3 created.
23:22:15,883         INFO RAMJobStore:139 - RAMJobStore initialized.
23:22:15,885         INFO QuartzScheduler:241 - Scheduler meta-data: Quartz Scheduler (v1.8.3) 

'MyScheduler' with instanceId '1'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

23:22:15,885         INFO StdSchedulerFactory:1275 - Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
23:22:15,886         INFO StdSchedulerFactory:1279 - Quartz scheduler version: 1.8.3
23:22:15,886         INFO QuartzScheduler:497 - Scheduler MyScheduler_$_1 started.
23:22:20,018         INFO TestJob:26 - running job! 1
23:22:50,004         INFO TestJob:26 - running job! 2
23:22:50,010         INFO TestJob:26 - running job! 3
23:22:50,014         INFO TestJob:26 - running job! 4
23:22:50,016         INFO TestJob:26 - running job! 5
...
23:22:50,999         INFO TestJob:26 - running job! 672
23:22:51,000         INFO TestJob:26 - running job! 673

Обратите внимание, как в 23: 22: 20 018, работа работает нормально. На этом этапе работа переосмысливает себя, чтобы работать каждые 50 секунд. В следующий раз, когда он будет работать (в 23: 22: 50 004), он запланирован сотни раз.

Любые идеи о том, как настроить работу пока выполнение этой работы? Что я делаю не так?

Спасибо!

Это было полезно?

Решение

Легкий.

Во -первых, у вас есть пара недоразумений о выражениях Cron. " */20 * * * *?" Каждые двадцать секунд, как следует из комментария, но только потому, что 60 равномерно делится на 20 »./50 ... "не каждые пятьдесят секунд. Это секунды 0 и 50 каждой минуты. В качестве другого примера"/13 ... " - это секунды 0, 13, 26, 39 и 52 каждой минуты - так что между вторыми 52 и следующей минутой 0 секунды, всего 8 секунд, а не 13. Так что с */50 вы Получите 50 секунд между любой другой стрельбой и 10 секундами между другими.

Это, однако, не является причиной вашего быстрого выстрела работы. Проблема в том, что текущая секунда - «50», и вы планируете новый триггер, чтобы выстрелить на второй «50», поэтому он сразу же стреляет. И тогда это все еще второе 50, и задание снова выполняется, и он запланирует еще один триггер для стрельбы на второй 50 и т. Д., Как можно больше раз в течение 50 -й секунды.

Вам необходимо установить время начала триггера в будущее (по крайней мере, одну секунду), иначе он будет стрелять в ту же секунду, когда вы планируете его, если график соответствует текущей секунду.

Кроме того, если вам действительно нужен каждый график типа «n» секунды, я предлагаю SimpleTrigger, а не Crontrigger. SimplyTrigger может делать «каждые 35 секунд» или «каждые 50 секунд» без проблем. Crontrigger предназначен для выражений, таких как «в секундах 0, 15, 40 и 43 минутах 15 и 45 10 часов часа в каждый понедельник января».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top