Планировщик Java Quarter немедленно запускает новое задание

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

Заранее спасибо.


person user590586    schedule 27.03.2012    source источник


Ответы (3)


Все задания, зарегистрированные в Quartz Scheduler, однозначно идентифицируются. с помощью JobKey, состоящего из имени и группы . Вы можете немедленно запустить задание с заданным JobKey. вызвав triggerJob(JobKey jobKey) вашего экземпляра Scheduler.

//Create a new Job 
JobKey jobKey = JobKey.jobKey("myNewJob", "myJobGroup");
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity(jobKey).storeDurably().build();

//Register this job to the scheduler
scheduler.addJob(job, true);

//Immediately fire the Job MyJob.class
scheduler.triggerJob(jobKey);

Примечание :

  • scheduler — это экземпляр планировщика, используемый в вашем приложении. Его метод start() должен быть уже вызван после его создания.

  • Задание является долговременным заданием, к которому нельзя прикрепить какие-либо триггеры или cron. Его можно запустить только программно, вызвав triggerJob(JobKey jobKey).

person Ken Chan    schedule 27.03.2012
comment
Почему бы не использовать SimpleTrigger и не использовать scheduler.scheduleJob(), что приведет к немедленному выполнению? - person basZero; 31.12.2012
comment
К вашему сведению, JobKey не является частью API версии 1.5.2. - person David Mann; 03.01.2014
comment
Задание должно быть установлено устойчивым (.storeDurably()), но тогда мы должны очистить его вручную (возможно, с помощью scheduler.deleteJob()), иначе задание будет постоянно оставаться в БД. Интересно, как люди справляются с этой проблемой? - person leeyuiwah; 04.03.2014
comment
Обычно вы не хотите увольнять работу одновременно. Это возможно, как вы запланировали задание, а затем уволить его немедленно. Если вы используете версию 2.x, вы можете аннотировать свой класс задания с помощью @DisallowConcurrentExecution, но если вы используете более старые версии, вы можете реализовать свое задание, используя старый интерфейс StatefulJob. - person Yuci; 06.05.2016

Да, используйте следующий Trigger, чтобы немедленно запустить свою работу, вместо того, чтобы ждать выражений Cron.

    String jobName = ""; // Your Job Name
    String groupName = ""; // Your Job Group
    Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(jobName, groupName)
                .startNow()
                .build();
person Rohit Bansal    schedule 28.03.2012
comment
Гораздо лучше, чем создание параметра утечки памяти durable = true ;) - person BrunoJCM; 09.07.2013

Вы можете создать «JobKey» на лету с двумя строковыми значениями ключа.

IScheduler sched = /* however you get your scheduler*/;

sched.TriggerJob(new JobKey("myname", "mygroup"));
person granadaCoder    schedule 02.02.2018
comment
Пожалуйста, добавьте хотя бы краткое описание. - person Valdi_Bo; 02.02.2018