Подтвердить что ты не робот

Работы по стрельбе из кварца вручную

У нас есть несколько заданий Quartz, настроенных в нашем приложении. Во время разработки мы оставляем планировщик кварца в режиме ожидания, однако мы иногда хотим начать работу вручную (для целей разработки). Если я вызову fireTrigger, он скажет мне, что мне нужно запустить планировщик. Однако, если я запустил планировщик, он также сразу заплатит все остальные задания, чего я не хочу (поскольку они могут срабатывать, когда я отлаживаю задание, выполненное вручную).

Я могу приостановить все триггеры при запуске планировщика, но тогда мне приходится иметь дело с инструкциями по пропускам и т.д.

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

4b9b3361

Ответ 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>