我的属性文件中有一个 cron 表达式,但计划注释不会像 Spring 中的 Scheduled 注释那样采用该属性。
春天你可以做:
@Scheduled(cron = "${app.cronExpiredDepartures}")
我想对 EJB 做同样的事情。此时,我不关心计时器是编程的还是自动的,我只是想要更简单的方法来在我的计时器中使用 cron 属性。
我尝试使用@Schedule注释的info属性,但没有成功:
@Inject
@ConfigProperty(name = "app.cronExpiredDepartures", defaultValue = "* * * * *")
private String cronExpression;
@Schedule(persistent = false, info = "app.cronExpiredDepartures")
@Transactional
public void checkExpiredDepartures() {
System.out.println("checkExpiredDepartures executed");
blabla
}
}
}
这是我的属性文件中的 cron 表达式:
app.cronExpiredDepartures="* * * * *"
含义:
任何一刻, 任何时间, 任何一天, 任何一个月, 一周中的任何一天
所以:每分钟执行一次。
我也尝试过使用编程方法,但没有结果。超时方法不运行:
@无状态 公开课 ExpirationWatch {
@Resource
private TimerService timerService;
@Inject
@ConfigProperty(name = "app.cronExpiredDepartures", defaultValue = "* * * * *")
private String cronExpression;
@PostConstruct
public void init() {
ScheduleExpression schedule = new ScheduleExpression();
String[] parts = cronExpression.split(" ");
schedule
.second("0")
.minute(parts[0])
.hour(parts[1])
.dayOfMonth(parts[2])
.month(parts[3])
.dayOfWeek(parts[4]);
timerService.createCalendarTimer(schedule, new TimerConfig("ExpirationWatchTimer", false));
}
@Timeout
@Transactional
public void checkExpiredDepartures() {
System.out.println("checkExpiredDepartures executed");
}
}
}
}
我找到了一种让它发挥作用的方法。看来问题出在注释上。即使我将其更改为非常简单的情况,我的 EJB 编程计时器也没有执行。
我使用了注解@Singleton,而不是@Stateless(两者都不能使用)和@Startup,如下所示:
@Singleton
@Startup
public class ExpirationWatch {
@Resource
private TimerService timerService;
@Inject
@ConfigProperty(name = "app.cronExpiredDepartures", defaultValue = "* * * * *")
private String cronExpression;
@PostConstruct
public void init() {
ScheduleExpression schedule = new ScheduleExpression();
String[] parts = cronExpression.split(" ");
schedule
.second("0")
.minute(parts[0])
.hour(parts[1])
.dayOfMonth(parts[2])
.month(parts[3])
.dayOfWeek(parts[4]);
timerService.createCalendarTimer(schedule, new TimerConfig("ExpirationWatchTimer", false));
}
@Timeout
@Transactional
public void checkExpiredDepartures() {
System.out.println("checkExpiredDepartures executed");
}
}
}