我正在尝试使用Spring Boot AutoConfigured @EnableScheduling
来创建一个cron作业。如果fixedRateString
是硬编码的,则作业触发完全正常。但是,如果我尝试使用SpEL来提供值,它就不会成功。
// JavaConfig中的Bean实例化
@Bean
public AlertbotJob2 getAlertJob2() {
AlertbotJob2 alertbotJob2 = new AlertbotJob2("alertId", "alertName", "alertSubject", "6000", true);
return alertbotJob2;
}
Bean定义
public class AlertbotJob2 {
String alertId;
String alertName;
String alertSubject;
public String cronPattern;
boolean isActive;
public AlertbotJob2() {
}
public AlertbotJob2(String alertId, String alertName, String alertSubject, String cronPattern, boolean isActive) {
super();
this.alertId = alertId;
this.alertName = alertName;
this.alertSubject = alertSubject;
this.cronPattern = cronPattern;
this.isActive = isActive;
}
@Scheduled(initialDelay = 60000, fixedRateString = "#{this.cronPattern}")
public void doTheJob() {
System.out.println("DoSomething");
}
}
异常是::表达式解析失败;嵌套异常是org.springframework.expression.spel.SpelEvaluationException:EL1008E:在'org.springframework.beans.factory.config.BeanExpressionContext'类型的对象上找不到属性或字段'this' - 可能不公开?
我只是想动态设置触发值。请帮忙。
答案 0 :(得分:0)
我认为你不能像这样使用SpEL。 也许更好的方法是在某些属性中定义你的cron模式,如:
myapp.scheduler.cronPattern=...
然后使用以下语法:
@Scheduled(cron = "${myapp.scheduler.cronPattern}")
public void doTheJob() {
...
}
答案 1 :(得分:0)
您无法在那里使用this
。
您必须通过bean名称@someBean.cronPattern
来完成。
答案 2 :(得分:0)
解决方案1:如果已知硬编码模式,则使用硬编码模式 @Scheduled(cron =" 0 0/5 * * * MON-FRI")
解决方案2:如果某个属性中的模式可用 @Scheduled(cron =" $ {myapp.scheduler.cronPattern}")
解决方案3:此方法不使用注释。相反,Beans只是作为runnables实现然后覆盖SchedulingConfigurer.configureTasks()以使用taskRegistrar.addCronTask(urRunnableJob,urCronPatternFromDB)动态设置日程表。 。 Cron模式存储在数据库表中,将其初始化为如下属性。
class AppConfig {
@Autowired
ConfigurableEnvironment environment;
private void initPropertiesMap() {
environment.getPropertySources()
.addLast(new MapPropertySource("myAppProperties", myAppProperties.getProperties())); // Prior DAO call required to read the configs from database
}
@PostConstruct
public void postConstruct() {
initPropertiesMap();
}
}