【发布时间】:2014-10-18 14:24:39
【问题描述】:
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),那么当已经有一个持续存在时,有人只是忽略了创建计时器的尝试。
【问题讨论】: