gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:02:20 27 4
gpt4 key购买 nike

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

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

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

作业 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 管理它们之前,我手动创建了它们,并且在配置文件中有一个 boolean 参数和 cron 参数,用于指定是否必须启用作业:

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

如何在 Spring 中使用此参数有条件地创建或直接忽略 bean,具体取决于此配置参数?

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

最佳答案

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

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

来自 docs :

CRON_DISABLED

public static final String CRON_DISABLED
A special cronexpression value that indicates a disabled trigger: "-". This isprimarily meant for use with ${...} placeholders, allowing forexternal disabling of corresponding scheduled methods.

Since:5.1 See Also: ScheduledTaskRegistrar.CRON_DISABLED

关于java - 如何有条件地启用或禁用 Spring 中的计划作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18406713/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com