一尘不染

如何在Spring中有条件地启用或禁用计划的作业?

spring

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

Cron模式存储在配置属性文件中。实际上,有两个属性文件:一个默认配置,一个与环境相关的配置文件配置(例如dev,test,prod客户1,prod客户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中使用此参数根据此config参数有条件地创建或完全忽略bean?

一种明显的解决方法是定义一个永远不会求值的cron模式,因此永远不会执行该作业。但是仍然会创建bean,并且配置会有些晦涩,所以我觉得必须有一个更好的解决方案。


阅读 489

收藏
2020-04-13

共1个答案

一尘不染

@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...

        }
    }
}
2020-04-13