Как создать рубильник для переключения spring-quartz приложения с кластера на standalone?

191
22 ноября 2021, 16:20

Приложение на 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?

READ ALSO
Spring работа со сторонним API

Spring работа со сторонним API

Изучаю Spring и вот хочу реализовать работу с методами внешнего API

181
Генерация строки

Генерация строки

Подскажите, как генерировать строку если есть алфавит:

109
Как сохранить список ArrayList в массив

Как сохранить список ArrayList в массив

Нужно сделать параметризованный класс, хранящий массив, с некоторой функциональностью ArrayList в виде функций add(T el), remove(int index), get(int index)

306
Пройти с for по двумерному массиву

Пройти с for по двумерному массиву

Вопрос такой, дана задача на 8 ферзей и метод

90