最佳答案
我在 Spring 中使用 @Scheduled
注释使用 cron 样式模式定义计划作业。
Cron 模式存储在配置属性文件中。实际上有两个属性文件: 一个默认配置和一个与环境相关的配置文件(例如 dev、 test、 prod customer 1、 prod customer 2等) ,并覆盖一些默认值。
我在 Spring 上下文中配置了一个属性占位符 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 模式,这样作业就永远不会执行。但是 bean 仍然会被创建,而且配置会有点模糊,所以我觉得必须有一个更好的解决方案。