如何在春季有条件地启用或禁用计划作业?

2022-08-31 10:41:13

我正在使用注释在Spring中使用cron样式模式定义计划作业。@Scheduled

cron 模式存储在配置属性文件中。实际上有两个属性文件:一个默认配置和一个依赖于环境的配置文件配置(例如,dev,test,prod customer 1,prod customer 2 等),并覆盖一些默认值。

我在我的弹簧上下文中配置了一个属性占位符bean,它允许我使用样式占位符从我的属性文件中导入值。${}

工作豆看起来像这样:

@Component
public class ImagesPurgeJob implements Job {

    private Logger logger = Logger.getLogger(this.getClass());

    @Override
    @Transactional(readOnly=true)
    @Scheduled(cron = "${jobs.mediafiles.imagesPurgeJob.schedule}")
    public void execute() {
        //Do something
            //can use DAO or other autowired beans here
    }
}

我的上下文 XML 的相关部分:

<!-- Enable configuration of scheduled tasks via annotations -->
    <task:annotation-driven/>

<!-- Load configuration files and allow '${}' style placeholders -->
    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:config/default-config.properties</value>
                <value>classpath:config/environment-config.properties</value>
            </list>
        </property>
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="ignoreResourceNotFound" value="false"/>
    </bean>

我真的很喜欢这个。它非常简单干净,具有最小的XML。

但是,我还有一个要求:在某些情况下,其中一些工作可以完全禁用。

因此,在我使用Spring管理它们之前,我手动创建了它们,并且在配置文件中有一个布尔参数以及cron参数,以指定是否必须启用作业:

jobs.mediafiles.imagesPurgeJob.enable=true or false
jobs.mediafiles.imagesPurgeJob.schedule=0 0 0/12 * * ?

我如何在Spring中使用此参数来有条件地创建或只是简单地忽略bean,这取决于这个配置参数?

一个明显的解决方法是定义一个永远不会评估的cron模式,因此永远不会执行作业。但是豆子仍然会被创建,配置会有点晦涩难懂,所以我觉得一定有更好的解决方案。


答案 1

在 Spring 中禁用的最有效方法是将 cron 表达式设置为@Scheduled-

@Scheduled(cron = "-")
public void autoEvictAllCache() {
    LOGGER.info("Refresing the Cache Start :: " + new Date());
    activeMQUtility.sendToTopicCacheEviction("ALL");
    LOGGER.info("Refresing the Cache Complete :: " + new Date());
}

文档中

CRON_DISABLED

公共静态最终字符串 CRON_DISABLED
指示禁用触发器的特殊 cron 表达式值:“-”。这主要用于 ${...} 占位符,允许外部禁用相应的计划方法。

起:5.1 参见:ScheduledTaskRegistrar.CRON_DISABLED


答案 2
@Component
public class ImagesPurgeJob implements Job {

    private Logger logger = Logger.getLogger(this.getClass());

    @Value("${jobs.mediafiles.imagesPurgeJob.enable}")
    private boolean imagesPurgeJobEnable;

    @Override
    @Transactional(readOnly=true)
    @Scheduled(cron = "${jobs.mediafiles.imagesPurgeJob.schedule}")
    public void execute() {

         //Do something
        //can use DAO or other autowired beans here
        if(imagesPurgeJobEnable){

            Do your conditional job here...

        }
    }
}

推荐