Работы по стрельбе из кварца вручную
У нас есть несколько заданий Quartz, настроенных в нашем приложении. Во время разработки мы оставляем планировщик кварца в режиме ожидания, однако мы иногда хотим начать работу вручную (для целей разработки). Если я вызову fireTrigger, он скажет мне, что мне нужно запустить планировщик. Однако, если я запустил планировщик, он также сразу заплатит все остальные задания, чего я не хочу (поскольку они могут срабатывать, когда я отлаживаю задание, выполненное вручную).
Я могу приостановить все триггеры при запуске планировщика, но тогда мне приходится иметь дело с инструкциями по пропускам и т.д.
Есть ли простой способ отключить задание вручную, не имея дело с паузой и пропуском зажигания (т.е. fireTrigger, который работает, даже если планировщик находится в режиме ожидания)?
Ответы
Ответ 1
это цикл, который вам потребуется для запуска задания вручную:
scheduler = stdSchedulerFactory.getScheduler();
//note: "stdSchedulerFactory" is the object created of
//the schedulerFactory(Standard) class.
// loop jobs by group
for (String groupName : scheduler.getJobGroupNames()) {
// get jobkey
for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher
.jobGroupEquals(groupName))) {
String jobName = jobKey.getName();
String jobGroup = jobKey.getGroup();
scheduler.triggerJob(jobName, jobGroup);
}
}
Ответ 2
Все вакансии, зарегистрированные в Quartz Scheduler, уникально идентифицируются с помощью JobKey, состоящего из имени и группы. Вы можете сразу запустить задание, которое имеет заданный JobKey, вызвав triggerJob(JobKey jobKey)
вашего экземпляра планировщика.
//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 - это экземпляр Scheduler, используемый во всем приложении. Его метод start() должен быть вызван после его создания.
Задача - это долговременное задание, которое не может подключать к нему триггеры или cron. Его можно запускать только программным путем, вызывая triggerJob(JobKey jobKey)
.
Ответ 3
Вы можете попробовать добавить триггерный фильтр в планировщик
this.scheduler.addGlobalTriggerListener(new DebugExecutionFilter());
Фильтр выполнения отладки добавит вето, когда выполнение не будет изменено (не запланировано для немедленного запуска), и вы находитесь в режиме отладки.
Вот пример реализации:
private static class DebugExecutionFilter implements TriggerListener
{
public DebugExecutionFilter()
{
}
@Override
public String getName()
{
return "Task execution filter";
}
@Override
public void triggerFired(Trigger trigger, JobExecutionContext context)
{
// Do nothing
}
/* (non-Javadoc)
*
* @see org.quartz.TriggerListener#vetoJobExecution(org.quartz.Trigger, org.quartz.JobExecutionContext) */
@Override
@SuppressWarnings("unchecked")
/**
* A veto is added if :
* - For non volatile trigger if we are in debug mode
*/
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context)
{
try
{
//
if ( !trigger.isVolatile() && isDebugMode() )
{
return true;
}
//task is run by scheduler.triggerJobWithVolatileTrigger() for immediate schedule
//or task is schedule and we are not in debugMode
return false;
}
@Override
public void triggerMisfired(Trigger trigger)
{
// do nothing
}
@Override
public void triggerComplete(Trigger trigger, JobExecutionContext context, int triggerInstructionCode)
{
// do nothing
}
}
Ответ 4
Нет необходимости в start-time
и end-time
.
<trigger>
<cron>
<name>TestTrigger</name>
<group>CronSampleTrigger</group>
<description>CronSampleTrigger</description>
<job-name>TestJob</job-name>
<job-group>jobGroup1</job-group>
<!--<start-time>1982-06-28T18:15:00.0Z</start-time>
<end-time>2020-05-04T18:13:51.0Z</end-time>-->
<cron-expression>0 0/1 * * * ?</cron-expression>
</cron>
</trigger>