java - 如何为 dev 和 stg 环境禁用 Quartz 调度程序

标签 java spring-boot quartz-scheduler

我有三个环境 dev、stg 和 prod server。我有一个微服务项目,它有用于将每日报告作为电子邮件发送的 quartz 调度程序。 quartz 配置如下:

现在的问题是我希望用于发送每日报告邮件的 quartz 调度程序仅在 prod 环境服务器上注册和运行。我不希望调度程序在 stg 和 dev 环境服务器下执行。

我正在使用 AWS ec2 实例作为环境服务器

谁能告诉我如何做到这一点。我们有什么简单的配置可以实现吗

AutowiringSpringBeanJobFactory.java

public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {

    private transient AutowireCapableBeanFactory beanFactory;

    @Override
    public void setApplicationContext(final ApplicationContext context) {
        beanFactory = context.getAutowireCapableBeanFactory();
    }

    @Override
    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
        final Object job = super.createJobInstance(bundle);
        beanFactory.autowireBean(job);
        return job;
    }
}

QuartzConfiguration.java

@Configuration
@ConditionalOnProperty(name = "quartz.enabled")
public class QuartzConfiguration {

    @Autowired
    List<Trigger> listOfTrigger;

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

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource, JobFactory jobFactory) throws IOException {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setOverwriteExistingJobs(true);
        factory.setDataSource(dataSource);
        factory.setJobFactory(jobFactory);
        factory.setQuartzProperties(quartzProperties());
        if (!ApplicationUtil.isObjectEmpty(listOfTrigger)) {
            factory.setTriggers(listOfTrigger.toArray(new Trigger[listOfTrigger.size()]));
        }

        return factory;
    }

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

    public CronTriggerFactoryBean createCronTrigger(JobDetail jobDetail, String cronExpression) {
        CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean();
        factoryBean.setJobDetail(jobDetail);
        factoryBean.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
        factoryBean.setCronExpression(cronExpression);
        factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW);
        return factoryBean;
    }

    @SuppressWarnings("rawtypes")
    public JobDetailFactoryBean createJobDetail(Class jobClass) {
        JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
        factoryBean.setJobClass(jobClass);
        factoryBean.setDurability(true);
        return factoryBean;
    }

    @Bean
    public JobDetailFactoryBean dailyEmailJobDetail() {
        return createJobDetail(DailyReportScheduleJob.class);
    }

    @Bean(name = "dailyReportEmailSyncJobTrigger")
    public CronTriggerFactoryBean dailyReportEmailSyncJobTrigger(@Qualifier("dailyEmailJobDetail") JobDetail jobDetail, @Value("${cron.frequency.daily-report-trigger}") String frequency) {
        return createCronTrigger(jobDetail, frequency);
    }
}

quartz.properties

org.quartz.scheduler.instanceName=springBootQuartzApp
org.quartz.scheduler.instanceId=AUTO
org.quartz.threadPool.threadCount=5
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties=true
org.quartz.jobStore.misfireThreshold=60000
org.quartz.jobStore.tablePrefix=quartz_
org.quartz.jobStore.isClustered=true
org.quartz.jobStore.clusterCheckinInterval=20000
org.quartz.plugin.shutdownHook.class=org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownHook.cleanShutdown=TRUE

bootstrap.yml

quartz:
  enabled: true

cron:
  frequency:
    daily-report-trigger: 0 0 9 1/1 * ? *

最佳答案

解决方法是使用 setAutoStartup这样的方法

@Bean
SchedulerFactoryBean schedulerFactoryBean() {
    SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
    schedulerFactoryBean.setAutoStartup(settings.enabled);
    if (settings.enabled) {
        ...
        schedulerFactoryBean.setWaitForJobsToCompleteOnShutdown(true);
        schedulerFactoryBean.setQuartzProperties(quartzProperties);
    } else {
        log.warn("Can't initialize Quartz because it's not enabled");
    }
    return schedulerFactoryBean;
}

因此,如果 settings.enabled 为 false,quartz 将不会被初始化,除非您显式启动 quartz 调用 start。方法。

关于java - 如何为 dev 和 stg 环境禁用 Quartz 调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48808664/

相关文章:

java - 如何使 JDialog 处于非 Activity 状态

spring-boot - Keycloak Kubernetes 401未经授权

java - Spring框架无法启动嵌入式容器

java - Quartz 中的多个 SchedulerFactory

java - 如何在 Controller 中映射两个不同的url : one url with param and the same without the param?

java - 处理3.2中设置图像colorkey

java - Spring CrudRepository .orElseThrow()

grails - 如何在Grails中从 Controller 设置cron作业的cron表达式

java - Spring 启动: Use @Autowired within a Quartz Job

java - 获取维基百科文章的父类别