Приложение на spring4+spring-quartz
Нужно вынести настройку isClustered как рубильник во внешние настройки(сейчас все настройки указаны в quartz.properties)
Все джобы, триггеры и scheduler'ы созданы с помощью аннотаций, поэтому я решил попробовать подменить бин StdSchedulerFactory на свой при создании планировщика по расписанию
Сам бин-фактори которым пытаюсь подменить стандарнтный
@Bean
@Scope("prototype")
public StdSchedulerFactory toggleFactory() throws SchedulerException {
Properties props = new Properties();
props.put(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME, "MyProjectClusteredScheduler");
props.put(StdSchedulerFactory.PROP_SCHED_INSTANCE_ID, "AUTO");
props.put(StdSchedulerFactory.PROP_THREAD_POOL_CLASS, "org.quartz.simpl.SimpleThreadPool");
props.put("org.quartz.threadPool.threadCount", "1");
props.put("org.quartz.threadPool.makeThreadsDaemons", "true");
props.put("org.quartz.jobStore.misfireThreshold", "60000");
props.put(StdSchedulerFactory.PROP_JOB_STORE_CLASS, "org.quartz.impl.jdbcjobstore.JobStoreTX");
props.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.oracle.OracleDelegate");
props.put(StdSchedulerFactory.PROP_JOB_STORE_USE_PROP, "false");
props.put("org.quartz.jobStore.dataSource", "MyProject");
props.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
props.put("org.quartz.jobStore.isClustered", "true");
props.put("org.quartz.jobStore.clusterCheckinInterval", "20000");
props.put("org.quartz.dataSource.MyProject.jndiURL", "java:comp/env/jdbc/MyProject");
StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
schedulerFactory.initialize(props);
return schedulerFactory;
}
И класс, в котором пытаюсь создать планировщик
@Bean
@DependsOn(value = {"entityManagerFactory", "dataSource"})
public JobDetail cronJobWorker () {
JobKey jobKey = new JobKey(QRTZ_JOB, QRTZ_GROUP);
return JobBuilder
.newJob(WorkerJob.class)
.storeDurably(true)
.requestRecovery(true)
.withIdentity(jobKey).build();
}
@Bean
@DependsOn(value = {"entityManagerFactory", "dataSource"})
public Trigger cronTriggerWorker () {
TriggerKey triggerKey = new TriggerKey(QRTZ_TRIGGER, QRTZ_GROUP);
return TriggerBuilder
.newTrigger()
.withIdentity(triggerKey)
.withSchedule(createSchedule(TIME)).build();
}
@Bean
@DependsOn(value = {"entityManagerFactory", "dataSource"})
public Scheduler cronSchedulerWorker (JobDetail cronJobWorker, Trigger cronTriggerWorker, StdSchedulerFactory
toggleFactory) throws SchedulerException {
Scheduler scheduler = toggleFactory.getDefaultScheduler();
boolean triggerExist = scheduler.checkExists(cronTriggerWorker.getKey());
boolean jobExist = scheduler.checkExists(cronJobWorker.getKey());
if (triggerExist || jobExist) {
scheduler.deleteJob(new JobKey(QRTZ_JOB, QRTZ_GROUP));
}
scheduler.start();
scheduler.getContext().put("SERVICE", service);
scheduler.scheduleJob(cronJobWorker, cronTriggerWorker);
return scheduler;
}
private static ScheduleBuilder createSchedule (String cronExpression){
CronScheduleBuilder builder = CronScheduleBuilder.cronSchedule(cronExpression);
return builder;
}
Здесь, в методе cronSchedulerWorker подсовываю свой фактори и пытаюсь с его помощью создать Scheduler
Все собралось и запустилось. Но, удалил quartz.propepties и задача запускается на всех нодах одновременно. Похоже что мой фактори игнорируется, а в случае если не найден quatz.properties - используется по умолчанию isClustered=false
На правильно ли я пути? Может быть есть какие-то другие способы, например через jndi ресурс напряму указывать значение в quartz.properies?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Изучаю Spring и вот хочу реализовать работу с методами внешнего API
Нужно сделать параметризованный класс, хранящий массив, с некоторой функциональностью ArrayList в виде функций add(T el), remove(int index), get(int index)