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 для условного создания или просто игнорирования компонента в зависимости от этого параметра конфигурации?
Один очевидный обходной путь - определить шаблон cron, который никогда не будет оцениваться, поэтому задание никогда не выполняется. Но bean-компонент все равно будет создан, а конфигурация будет немного неясной, поэтому я считаю, что должно быть лучшее решение.