Все запланированные задания выполняются, даже если указаны идентификаторы узлов - PullRequest
0 голосов
/ 03 сентября 2018

У меня настроено два задания. И я упомянул идентификатор узла рабочих групп. Мое требование состоит в том, чтобы выполнить определенные работы на определенном упомянутом узле. Но когда я запускаю свое приложение, все задания выполняются, хотя я упоминаю идентификатор узла в файле свойств.

Пожалуйста, проверьте ниже код. Я использую Кварц с весенней загрузкой.

pom.xml

<dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.terracotta.toolkit</groupId>
        <artifactId>terracotta-toolkit-api</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
        <groupId>org.terracotta.quartz</groupId>
        <artifactId>quartz-terracotta-ee</artifactId>
        <version>2.3.10</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>23.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.5</version>
    </dependency>

FirstJob

public class FirstJob implements Job, Serializable {


    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("In First Job Execution....");
        JobKey jobKey = context.getJobDetail().getKey();
        JobDataMap data = context.getJobDetail().getJobDataMap();
    }

SecondJob

public class SecondJob implements Job, Serializable {
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("In Second Job Execution....");
        JobKey jobKey = context.getJobDetail().getKey();
        JobDataMap data = context.getJobDetail().getJobDataMap();
    }
}

ScheduleConfig

@Configuration
public class SchedulerConfig {

private static final Logger LOG = LoggerFactory.getLogger(SchedulerConfig.class);

@Bean
public JobFactory jobFactory(ApplicationContext applicationContext) {
    AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
    jobFactory.setApplicationContext(applicationContext);
    return jobFactory;
}


@Bean
public Scheduler schedulerFactoryBean(DataSource dataSource,JobFactory jobFactory)throws Exception{
    SchedulerFactoryBean factory = new SchedulerFactoryBean();
    factory.setOverwriteExistingJobs(true);
    factory.setDataSource(dataSource);
    factory.setJobFactory(jobFactory);
    factory.setQuartzProperties(quartzProperties());
    factory.afterPropertiesSet();

    Scheduler scheduler = factory.getScheduler();
    scheduler.setJobFactory(jobFactory);

    TriggerKey triggerKey = TriggerKey.triggerKey("FirstJob", "firstTriggers");
    CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);

    JobDetail jobDetail = localJob(newJob(FirstJob.class).withIdentity("FirstJob", "firstJobs")
            .withDescription("i am first job").storeDurably(true).build())
            .where(node().is(partOfNodeGroup("firstJobs"))).build();

    FirstJob job = new FirstJob();
    jobDetail.getJobDataMap().put("firstJob", job);

    CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
    trigger = TriggerBuilder.newTrigger().withIdentity("FirstJob", "firstTriggers")
            .withSchedule(scheduleBuilder).build();
    System.out.println("Successfully configured First Job");
    //Second Job

    TriggerKey triggerKey1 = TriggerKey.triggerKey("SecondJob", "secondTriggers");
    CronTrigger trigger1 = (CronTrigger) scheduler.getTrigger(triggerKey1);

    JobDetail jobDetail1 = localJob(newJob(SecondJob.class).withIdentity("SecondJob", "secondJobs")
            .withDescription("i am second job").storeDurably(true).build())
            .where(node().is(partOfNodeGroup("secondJobs"))).build();

    SecondJob secondJob = new SecondJob();
    jobDetail1.getJobDataMap().put("secondJob", job);
    CronScheduleBuilder scheduleBuilder1 = CronScheduleBuilder.cronSchedule("0/17 * * * * ?");
    trigger1 = TriggerBuilder.newTrigger().withIdentity("SecondJob", "secondTriggers")
            .withSchedule(scheduleBuilder1).build();
    System.out.println("Successfully configured Second Job");

    System.out.println("Starting Schedulers....");
    scheduler.scheduleJob(jobDetail, trigger);
    scheduler.scheduleJob(jobDetail1, trigger1);

    scheduler.start();
    return scheduler;
}

@Bean
public Properties quartzProperties() throws IOException {
    PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
    propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
    propertiesFactoryBean.setLocation(new ClassPathResource("/quartzLocality.properties"));
    propertiesFactoryBean.afterPropertiesSet();
    return propertiesFactoryBean.getObject();
}
}

свойства приложения

spring.jpa.show-sql=true
spring.datasource.initialization-mode=always
spring.jpa.hibernate.ddl-auto = none

spring.jpa.database=mysql
spring.datasource.schema=classpath:db/quartz_tables_mysql.sql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/quartz
spring.datasource.username=root
spring.datasource.password=root

quartz.properties

org.quartz.scheduler.instanceName=springboot-quartz
org.quartz.scheduler.instanceId=node1
org.quartz.threadPool.threadCount=2
org.quartz.jobStore.isClustered=true
org.quartz.jobStore.misfireThreshold=60000
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass= 
org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.plugin.jobInitializer.scanInterval = 0 

quartzLocality.properties

org.quartz.locality.nodeGroup.firstJobs = node0
#org.quartz.locality.nodeGroup.secondJobs = node1

org.quartz.locality.nodeGroup.allNodes = node0,node1

org.quartz.locality.nodeGroup.firstJobs.triggerGroups = firstTriggers
org.quartz.locality.nodeGroup.secondJobs.triggerGroups = secondTriggers

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

Сначала я получу это

Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'org.springframework.scheduling.quartz.LocalDataSourceJobStore' - which supports persistence. and is not clustered.

Затем я получаю это в том же исполнении ..

Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered

1 Ответ

0 голосов
/ 05 сентября 2018

вступление:

Вы уверены, что работаете в кластерном режиме правильно?

Правильно ли настроена конфигурация и проект вашей весенней загрузки в отношении кластеризации?

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

Использование магазина заданий 'org.quartz.simpl.RAMJobStore' - который не поддерживать настойчивость. и не кластеризован.

2018-09-05 13: 35: 03.433 INFO 9096 --- [главная] org.quartz.core.QuartzScheduler: Планировщик quartzScheduler _ $ _ NON_CLUSTERED запущен.

И, конечно, задания запускаются сразу на локальном компьютере.

Возможно, ваша конфигурация нуждается в настройке в отношении весенней загрузки и кластеризации. Например: https://medium.com/@Hronom/spring-boot-quartz-scheduler-in-cluster-mode-457f4535104d

Обновление:

На основании ваших логов я вижу ту же проблему:

Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered

Можете ли вы попробовать учебник, такой как этот, чтобы добавить поддержку кластеризации:

...