Планирование постоянной сущности

#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.