У меня есть задание, которое должно выполняться каждую минуту дня, и пользователь может запустить его в течение дня через интерфейс.
Поэтому я работаю с Quartz Scheduler, чтобы сохранить свою работу в JobDataMap.
@Service
public class MyJob {
private static final String TRIGGER_NAME = "myTriggerCronScheduleEveryMinute";
private static final String JOB_NAME = "jobRunner";
private static final String JOB_GROUPE = "groupRunnerJob";
private static final Logger LOGGER = LoggerFactory.getLogger(JobHoliday.class);
private Scheduler sched;
@EventListener(ApplicationReadyEvent.class)
public void registredJobOnTheSchedulerAfterApplicationReadyToServiceRequest() throws SchedulerException {
JobDetail job = newJob(SampleJob.class).withIdentity(JOB_NAME, JOB_GROUPE).storeDurably(true)
.requestRecovery(true).build();
Trigger trigger = newTrigger().withIdentity(TRIGGER_NAME, JOB_GROUPE)
.withSchedule(CronScheduleBuilder.cronSchedule(" 0 0/1 * 1/1 * ? *")).build();
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
try {
sched = schedFact.getScheduler();
} catch (SchedulerException e) {
LOGGER.info("SchedulerException is thrown after get the scheduler");
throw e;
}
try {
sched.start();
} catch (SchedulerException e) {
LOGGER.info("SchedulerException is thrown after start a job");
throw e;
}
try {
sched.scheduleJob(job, trigger);
} catch (SchedulerException e) {
LOGGER.info("SchedulerException is thrown after schedule a job");
throw e;
}
}
}
Затем я создаю другой класс, который также расширяет QuartzJobBean для реализации метода executeInternal.
@Override
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
Scheduler scheduler;
LOGGER.info("holiday job");
try {
try {
scheduler = new StdSchedulerFactory().getScheduler();
for (String groupName : scheduler.getJobGroupNames()) {
for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) {
if ("jobRunner".equals(jobKey.getName())) {
System.out.println("it's run");
} else {
System.out.println("it's not runing");
}
}
}
} catch (SchedulerException e) {
e.printStackTrace();
}
} catch (Exception e) {
LOGGER.info("Failed run Job holiday ", e);
throw new JobExecutionException(e);
}
LOGGER.info("Success run Job holiday");
}
Когда я запускаю приложение, оно не запускает задание, и это сбивает с толку, потому что когдаЯ создаю задание с минимальными инструкциями:
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("sample job");
}
Появится «пример задания».
Мой вопрос: почему такое поведение?Почему он показывает «рабочий пример» в одном классе, а не в другом?