JSR-000318规范定义了TimerService(第18章)。
鉴于EJB,您可以创建自动计时器或程序化计时器。
自动计时器看起来像这样
@Schedules(
{
@Schedule(hour=”12”, dayOfWeek=”Mon-Thu”),
@Schedule(hour=”11”, dayOfWeek=”Fri”)
})
public void sendLunchNotification() { ... }
程序化计时器看起来像这样
@Resource
private TimerService timerService;
void someMethod(){
ScheduleExpression exp = new ScheduleExpression();
(... set exp ...)
TimerConfig config = new TimerConfig();
(... set config ...)
Timer created = timerService.createCalendarTimer(exp,config);
}
创建程序化计时器时,计时器触发的任务是使用@Timeout
注释的任务我的问题,因为我在JSR中找不到它,如果使用相同的ScheduleExpression为同一个EJB创建2个编程计时器,容器必须调用@Timeout方法两次或一次?
让我的问题更清楚。
假设我已经创建了2个程序化计时器。每个元数据都有不同的元数据(存储在可序列化计时器INFO属性中)。然后,我想要有两个不同的计时器,当@Timeout方法执行时,它会获得这个INFO属性来选择做什么。
如果我的问题的答案是两次,那么我可以做到。如果我的问题的答案是一次,那么我就不能。
请注意,如果答案是一次,从性能的角度来看,这是有道理的,因为您实际上并不需要在给定时刻多次通知EJB,即使你有几个触发器,但如果你打算独立处理这些触发器(因为每个触发器有不同的INFO),那么有人只是忽略了创建计时器的尝试,因为已经存在一个计时器
答案 0 :(得分:2)
做这样的事情:
@Singleton
@Startup
public class TestBean {
// should be in a separate class
public enum TTimer {
FOO,
BAR
}
@Resource
TimerService timerService;
@PostConstruct
private void initSingleTimer() {
removeRunningTimers();
startInitialTimer();
}
private void removeRunningTimers() {
for (Timer t : timerService.getTimers()) {
if ( t.getInfo().equals(TTimer.FOO)) {
t.cancel();
log.trace("LogWatcher: Running timer canceled");
}
}
}
private void startInitialTimer() {
....
timerService.createTimer(startDate, interval, TTimer.FOO);
}
答案 1 :(得分:1)
定时器是不同的,所以如果你创建两个,那么无论调度信息是否相同,都会为两个定时器调用@Timeout方法。