Задание кварцевого планировщика не выполняется повторно каждые 5 минут

У меня есть код, чтобы запланировать выполнение задания каждые 5 минут. Код следующий

JobDetail jobDetail = JobBuilder.newJob(ChieldJob.class).withIdentity(("job_"+sched_id+"_"+schd_name), "todaysJob")
                            .setJobData(chieldJobData).build();

Код для создания триггера следующий.

Trigger trigger = TriggerBuilder.newTrigger().withIdentity(("trg_" + sched_id +"_"+schd_name), "todaysJob")
                            .startAt(new Date(row.get(field_Schd_Start_TS).longValue()))
                            .build();
trigger = trigger.getTriggerBuilder().withSchedule((ScheduleBuilder) SimpleScheduleBuilder.repeatMinutelyForever(5)).build();

Теперь я планирую работу по приведенному ниже коду

context.getScheduler().scheduleJob(jobDetail,trigger);

Здесь контекст - это объект JobExecutionContext, потому что я запускаю это задание из другого класса выполнения задания. Метод getScheduler () вернет тот же экземпляр планировщика, из которого выполняется основное задание.

Проблема в том, что это задание в объекте «jobDetail» выполняется только один раз в указанное время, указанное в «.startAt (new Date (row.get (field_Schd_Start_TS)»), тогда оно не выполняется каждые 5 минут. < strong> Я не могу понять, почему он не выполняется повторно.

В триггере nextFireTime имеет значение NULL. Почему? Я не могу этого узнать. Я делаю небольшую программу в основном методе для планирования задания, здесь я вижу, что, когда задание выполняется, мы получаем объект JobExecutionContext в этом задании, здесь я отлаживаю и вижу, что он содержит объект триггера, для которого установлен nextFireTime как и ожидалось. Но этого не происходит при реальной реализации того кода, который я использую.


person Dhaval Bhoot    schedule 21.06.2018    source источник
comment
В триггере nextFireTime имеет значение NULL. Почему? Я не могу этого узнать.   -  person Dhaval Bhoot    schedule 21.06.2018


Ответы (1)


Я нашел хороший пример на https://www.concretepage.com/scheduler/quartz/quartz-2-scheduler-simpletrigger-example-with-simpleschedulebuilder

У меня есть "некоторый" образец кода, работающий нормально (я использовал .repeatSecondlyForever, так как мне нужен был быстрый вывод отладки):

import org.quartz.JobBuilder;
import org.quartz.JobDetail;  
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Calendar;
import java.util.Date;

public class SimpleTriggerExample {
    public static void main(String[] args) throws SchedulerException {
         SchedulerFactory schedulerFactory = new StdSchedulerFactory();
         Scheduler scheduler = schedulerFactory.getScheduler();
         JobDetail jobDetail =     JobBuilder.newJob(PrintDateJob.class).withIdentity("goodjob", "mygroup").build();

         SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("goodjob", "mygroup")
            .startAt(new Date(Calendar.getInstance().getTimeInMillis() + 3000))
            .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5))
            .build();

        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();

        try {
            //wait to finish the job
            Thread.sleep(200000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //shutdown scheduler gracefully
        scheduler.shutdown(true);
    }
}

"PrintDateJob.class" находится здесь:

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;

import java.util.Date;

public class PrintDateJob implements Job {
    public void execute(JobExecutionContext context)
        throws JobExecutionException {
        JobKey jobKey = context.getJobDetail().getKey();
        System.out.println(jobKey+": "+ new Date());
    }
}

pom.xml находится здесь:

<?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>

        <groupId>chocksaway</groupId>
        <artifactId>001</artifactId>
        <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
    </dependencies>
</project>

Выполнение примера дало следующий результат:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
mygroup.goodjob: Thu Jun 21 15:15:53 BST 2018
mygroup.goodjob: Thu Jun 21 15:15:58 BST 2018
mygroup.goodjob: Thu Jun 21 15:16:03 BST 2018
mygroup.goodjob: Thu Jun 21 15:16:08 BST 2018
person chocksaway    schedule 21.06.2018
comment
такая демонстрация работает так, как ожидалось. но когда я использую это в своей реальной реализации кода, он перестает работать - person Dhaval Bhoot; 21.06.2018
comment
Какое значение вы получите для новой даты (row.get (field_Schd_Start_TS) .longValue ())? - person chocksaway; 22.06.2018
comment
Он вернет дату и время из базы данных. Он будет иметь формат длинного типа, из которого будет построен объект даты. поле в базе данных содержит значение в формате 2018-06-21 14:58:36 - person Dhaval Bhoot; 22.06.2018