Планирование заданий с использованием выражения cron из файла свойств

Я написал задание cron:

@Scheduled(cron="${process.virtual.account.start}")
public void ecomProcessVirAccOrderPaymentsScheduler() {
    LOGGER.info("Start --->" + this.getClass().getCanonicalName() + ".ecomProcessVirAccOrderPaymentsScheduler() Method");
    schedulerJobHelper.ecomProcessVirAccOrderPaymentsScheduler();
    LOGGER.info("End --->" + this.getClass().getCanonicalName() + ".ecomProcessVirAccOrderPaymentsScheduler() Method");
}

Я хочу, чтобы атрибут cron, используемый с аннотацией @Scheduled, был заполнен из внешнего файла свойств. В настоящее время я извлекаю его из файла свойств внутри области приложения. Я могу получить значение, но не могу использовать его с аннотацией @Schedule.

Ответ 1

Какую версию Spring Framework вы используете? Это не будет работать, если оно меньше, чем 3.0.1.

Сообщение об ошибке здесь spring 3.0.0, и оно было исправлено в 3.0.1.

Поэтому, если вы используете Spring 3.0.1 или более позднюю версию, выполните следующие действия для использования в выражении cron.

Сделайте запись в applicationContext.xml для класса PropertyPlaceHolderConfigurer, который
<bean id="placeholderConfig"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:ApplicationProps.properties</value>
        </list>
    </property>
</bean>

После этого используйте его, используя метод @Scheduled, например:

@Scheduled(cron="${instructionSchedularTime}")
public void load(){
}

Примечание: fixedDelay и fixedRate не могут получить значение свойства из держателя поля, поскольку они принимают длинное значение. Атрибут Cron принимает аргумент как String, поэтому вы можете использовать для этого заполнитель.

Ответ 2

это работает в весеннем ботинке.

@Scheduled(cron="${cronExpression}")
private void testSchedule()  {
    System.out.println("Helloooo");
}

в application.properties меня есть такое свойство, как показано ниже:

cronExpression=* * * ? * *

Ответ 3

Попробуйте что-то вроде

@Configuration
@PropertySource("/path/to/file")
public class LoadPropertiesFile{
   //Other project configurations
}

Для получения дополнительной информации нажмите здесь

Ответ 4

Вы можете присвоить значение непосредственно из файла свойств, я использую, кстати, весеннюю загрузку

@Scheduled(cron = "${com.oracle.fusion.cron}")
public void getInvoiceInterfaceHeader() {

}