当前位置: 首页 > 面试题库 >

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

宰父劲
2023-03-14
问题内容

我正在使用@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,并且配置会有些晦涩,所以我觉得必须有一个更好的解决方案。


问题答案:
@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...

        }
    }
}


 类似资料:
  • 我在Spring中使用注释定义了使用cron样式模式的调度作业。 cron模式存储在配置属性文件中。实际上有两个属性文件:一个默认配置文件,一个与环境相关的配置文件(例如dev、test、prod customer1、prod customer2等)覆盖了一些默认值。 我在spring上下文中配置了一个属性占位符bean,它允许我使用样式的占位符从属性文件中导入值。 作业bean如下所示: 我的上

  • 在Spring Boot application中,我使用@Schedured注释,使用cron样式模式来调度作业。 或者,当达到所需状态时,是否有其他方法禁用数据库轮询?

  • 我有一个spring boot应用程序,我需要每20秒刷新一次,所以我创建了这个: 它工作得很好,但当我向数据库中添加行时,在它为空之前,我想再次将计时器重置为20秒,有办法吗?

  • 我想实现下面的用例——我的Spring Boot应用程序应该只在应用程序中有某个属性时启动。yaml设置为: 如果未设置该属性,则上下文初始化将失败,并显示一条消息,表明该属性丢失。 我在这个主题中找到了如何实现它:Spring启动-检测和终止,如果属性没有设置?但是我不能遵循这种方法的问题是,在加载检查此属性的bean之前,上下文初始化可能会失败。 例如,如果其他bean由于缺少另一个属性而无法

  • 我找不到任何选项、设置或键盘快捷键来禁用或隐藏那个烦人的滚动条。我只是觉得它没有用,而且很分散注意力。 也不能像Atom一样编辑编辑器的CSS。

  • 我需要同一个锚链接有条件地指向本地或外部资源。我试过了 但是不管用。我没有得到任何错误,但它指向同一个本地页面,忽略了外部URL。有什么想法吗? 另一种选择是构建链接,但我找不到任何文档如何在服务内部访问 编辑:我知道我可以用克隆整个链接,但我不想这样做,我的链接包含一个带有一系列选项的视频标签