#java #hibernate #spring #quartz-scheduler
#java #переход в спящий режим #spring #quartz-планировщик
Вопрос:
Допустим, у меня есть некоторая сущность DB с полем CronExpression:
@Entity
@Table(name = "job")
public class Job {
...
private CronExpression cronExpression;
}
Каков наилучший подход для включения ее в расписание quartz? Я использую Spring3 и спящий режим. В принципе, я мог бы запланировать это в своем DAO — в любое время, когда создается или обновляется задание, — но мне также нужно было бы запланировать все существующие задания при запуске приложения..
Спасибо за ваши советы!
Комментарии:
1. Вы действительно хотите запланировать сущность? в quartz вы можете запланировать задание и загрузить сущность, если хотите, или кэшировать ее где-нибудь, если хотите повторно использовать экземпляр .. разве этого недостаточно? Я не могу разобраться в требовании .. можете ли вы объяснить подробнее?
2. На самом деле мне нужно выполнить некоторый метод (по расписанию, выраженному в сущности задания), который будет знать идентификатор задания — этого было бы достаточно
3. Можете ли вы рассказать мне о его бизнес-требованиях, чтобы вам пришлось реализовать подобное?
4. У меня есть список объектов Job, у всех них есть поле CronExpression, мне просто нужно выполнить некоторую службу (по расписанию в job.CronExpression) и передать туда задание. вот и все
Ответ №1:
Вам нужно DAO/Repository
получить все CronExpression из вашего хранилища. Я создаю в памяти DAO
@Repository
public class JobEntityDao {
public List<JobEntity> findAll() {
List<JobEntity> list = new ArrayList<JobEntity>();
JobEntity job1 = new JobEntity("0 0 12 * * ?");
JobEntity job2 = new JobEntity("0 15 10 ? * *");
JobEntity job3 = new JobEntity("0 15 10 * * ?");
list.add(job1);
list.add(job2);
list.add(job3);
return list;
}
}
И компонент для создания quartz scheduler на основе вашего CronExpression. Я называю это QuartzExecutor
@Service
public class QuartzExecutor {
private JobEntityDao jobEntityDao;
@Autowired
public QuartzExecutor(JobEntityDao jobEntityDao) throws ParseException, SchedulerException {
this.jobEntityDao = jobEntityDao;
init();
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private void init() throws ParseException, SchedulerException {
List<JobEntity> jobEntities = jobEntityDao.findAll();
for (JobEntity jobEntity : jobEntities) {
System.out.println(jobEntity.cronExpression);
RunMeTask task = new RunMeTask();
//specify your sceduler task details
JobDetail job = new JobDetail();
job.setName("runMeJob");
job.setJobClass(RunMeJob.class);
Map dataMap = job.getJobDataMap();
dataMap.put("runMeTask", task);
//configure the scheduler time
CronTrigger trigger = new CronTrigger();
trigger.setName("runMeJobTesting");
trigger.setCronExpression(jobEntity.cronExpression);
//schedule it
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
}
}
}
вы можете получить RunMeJob and RunMeTask
код из http://www.mkyong.com/java/quartz-scheduler-example /.
Я знаю, что дизайн класса не очень хорош, но моя забота — попытаться решить вашу проблему.
Это то, что вы ищете?
Комментарии:
1. Спасибо! Но что, если JobEntity изменит свое CronExpression?
2. Вы должны создать список планировщиков в качестве атрибута QuartzExecutor. и добавьте метод перезапуска При изменении сущности вы можете вызвать метод restart для вызова метода init.