我需要运行每天运行一次的日常工作,并从不同的数据库中获取一些数据。该任务是作为EJB开发的。我用EJB尝试了@Schedule,它工作正常。但问题是如果时间表发生变化,则必须更改代码并重新部署应用程序。有办法避免这种情况吗?可以使用配置文件等。我在CentOS中使用JSF 2.2,glassfish3.4.2。
答案 0 :(得分:1)
您可以通过以编程方式创建计时器来完成此操作
....
private static final String TIMER_NAME = "SOME_TIMER_NAME";
....
@Resource
TimerService timerService;
....
public void createTimer(String days, String hours, String minutes) {
removeTimer();
ScheduleExpression scheduleExpression = new ScheduleExpression();
if (days != null) {
scheduleExpression.dayOfMonth(datys);
}
if (hours != null) {
scheduleExpression.hour(hours);
}
if (minutes != null) {
scheduleExpression.minute(minutes);
}
TimerConfig timerConfig = new TimerConfig();
timerConfig.setInfo(TIMER_NAME);
Timer timer = timerService.createCalendarTimer(scheduleExpression, timerConfig);
}
private void removeTimer() {
for (Timer timer : timerService.getTimers()) {
if (TIMER_NAME.equals(timer.getInfo())) {
timer.cancel();
}
}
}
@Timeout
public void retrieveData() {
// retrieve data from DBs
}
现在像这样调用createTimer方法
createTimer("*", "3", null);
retrieveData()方法将在每天凌晨3:00执行。如果要更改计划,则应使用适当的值调用方法。您可以调整它以满足您的要求,例如添加输入验证,以不同方式定义参数等。您可能需要查看ScheduleExpression以找到最适合您的方法。我的代码只显示了一个想法。
答案 1 :(得分:-1)
你考虑过使用cron工作吗? 这里有些例子: Cron examples