Обжиг кварцевых работ вручную - PullRequest
15 голосов
/ 12 августа 2011

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

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

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

Ответы [ 4 ]

21 голосов
/ 04 сентября 2012

это цикл, который вам потребуется для запуска задания вручную:

  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);
    }

  }
3 голосов
/ 06 декабря 2017

Все задания, зарегистрированные в кварцевом планировщике, однозначно идентифицируются с помощью 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);

Примечание:

планировщик - это экземпляр планировщика, используемый в вашем приложении. Его метод start () должен быть вызван уже после его создания. Задание является долговременным заданием, которое не может прикрепить к нему никакие триггеры или cron. Его можно запустить только программным путем, вызвав triggerJob(JobKey jobKey).
1 голос
/ 24 марта 2015

Нет необходимости в 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>
0 голосов
/ 12 августа 2011

Вы можете попробовать добавить фильтр триггера в свой планировщик

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
    }

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