WedX - журнал о программировании и компьютерных науках

Spring-Boot с Quartz и несколькими планировщиками

Я работаю со сценарием, в котором у нас есть одна база данных с несколькими схемами, по одной схеме для каждого клиента. Это позволяет каждому клиенту устанавливать различные графики для своей работы. Все схемы имеют одинаковый набор заданий, отличаются только расписания.

Мне нужно написать одно приложение Spring-Boot для запуска всех заданий из всех схем.

Похоже, что это можно сделать, определив разные свойстваquartz.properties для каждой схемы, а затем настроив для каждой из них отдельный планировщик, например:

@SpringBootApplication
@Configuration
public class MyApplication{

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    @Bean
    public Scheduler schedulerA(Trigger trigger, JobDetail job) {
        StdSchedulerFactory factory = new StdSchedulerFactory();
        factory.initialize(new ClassPathResource("quartzA.properties").getInputStream());

        Scheduler scheduler = factory.getScheduler();
        scheduler.setJobFactory(springBeanJobFactory());
        scheduler.scheduleJob(job, trigger);

        scheduler.start();
        return scheduler;
    }

    @Bean
    public Scheduler schedulerB(Trigger trigger, JobDetail job) {
        StdSchedulerFactory factory = new StdSchedulerFactory();
        factory.initialize(new ClassPathResource("quartzB.properties").getInputStream());

        Scheduler scheduler = factory.getScheduler();
        scheduler.setJobFactory(springBeanJobFactory());
        scheduler.scheduleJob(job, trigger);

        scheduler.start();
        return scheduler;
    }    
}

Мой вопрос, это правильно? Могу ли я просто определить эти планировщики в моем классе SpringBootApplication, аннотированном @Configuration, и ожидать, что он будет работать (при условии, что свойства верны)? Я что-то упустил?


Ответы:


1

Мой вопрос, это правильно? Могу ли я просто определить эти планировщики в моем классе SpringBootApplication с аннотацией @Configuration

Это верно. В качестве альтернативы вы можете использовать аннотацию Spring @Scheduled с Cron, определенным в файлах свойств.

@Scheduled(cron = "0 15 10 15 * ?")
public void scheduleTaskUsingCronExpression() {
.
.
.

Но если вам нужен больший контроль над заданиями, такими как отработка отказа, политика повторных попыток или отслеживание и запуск/повторный запуск заданий с панели управления. Подумайте о spring-batch

12.09.2018

2

Вдохновленный приведенным выше примером, я нашел способ использовать конфигурации, управляемые в свойствах приложения, которые кажутся более простыми и более совместимыми с остальной частью приложения Spring-Boot. Особенно полезно повторно использовать конфигурацию источника данных. Возможно любое количество бобов второго вида.

@Configuration
class MainQuartzConfiguration {
    /**
     * Main scheduler bean where all jobDetails, calendars and trigger beans are attached.
     * 
     */
    @Primary @Bean
    public SchedulerFactoryBean mainScheduler(QuartzProperties properties,
            ObjectProvider<SchedulerFactoryBeanCustomizer> customizers,
            ObjectProvider<JobDetail[]> jobDetails, Map<String, Calendar> calendars,
            ObjectProvider<Trigger[]> triggers, ApplicationContext applicationContext) {
        SchedulerFactoryBean factory = new QuartzAutoConfiguration(properties, customizers, jobDetails, calendars, triggers, applicationContext)
                .quartzScheduler();
        factory.setSchedulerName("mainScheduler");
        return factory;
    }
}

@Configuration 
class AnotherConfiguration {
    /**
     * Second scheduler bean which has the same configuration but different thread count and thread priority.
     */
    
    @Bean
    SchedulerFactoryBean secondScheduler(
            QuartzProperties properties,
            ObjectProvider<SchedulerFactoryBeanCustomizer> customizers,
            @Value("${spring.quartz.properties.secondScheduler.org.quartz.threadPool.threadPriority:7}") int threadPriority,
            @Value("${spring.quartz.properties.secondScheduler.org.quartz.threadPool.threadCount:1}") int threadCount,
            ApplicationContext applicationContext)
    {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        SpringBeanJobFactory jobFactory = new SpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        schedulerFactoryBean.setJobFactory(jobFactory);
        schedulerFactoryBean.setSchedulerName("secondScheduler");
        schedulerFactoryBean.setAutoStartup(properties.isAutoStartup());
        schedulerFactoryBean
        .setStartupDelay((int) properties.getStartupDelay().getSeconds());
        schedulerFactoryBean.setWaitForJobsToCompleteOnShutdown(
                properties.isWaitForJobsToCompleteOnShutdown());
        Properties propertiesVariant = new Properties();
        propertiesVariant.putAll(properties.getProperties());
        propertiesVariant.setProperty("org.quartz.threadPool.threadPriority", Integer.toString(threadPriority));
        propertiesVariant.setProperty("org.quartz.threadPool.threadCount", Integer.toString(threadCount));
        schedulerFactoryBean.setQuartzProperties(propertiesVariant);
        schedulerFactoryBean.setJobDetails(CatalogBenchmarkJob.createJob());
        customizers.orderedStream().forEach(
                (customizer) -> customizer.customize(schedulerFactoryBean));
        return schedulerFactoryBean;
    }
}
06.03.2021
Новые материалы

Как создать диаграмму градиентной кисти с помощью D3.js
Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


Для любых предложений по сайту: [email protected]