如何使用程序化计时器在EJB
中运行特定的超时方法?
例如:
@TimeOut
public void myTmer() {}
@TimeOut
public void myTmer12() {}
我只希望在计时器到期时触发mytimer()
方法。我怎样才能做到这一点?
答案 0 :(得分:1)
作为程序化计时器的示例,您可能具有以下内容:
@LocalBean
@Singleton
@Startup // this timer bean will start on server startup
public class MyTimerBean {
// injection of the TimerService interface
@Resource
private TimerService timerService;
// on the post construct method one creates the timer
@PostConstruct
private void init() {
// creation of a timer whose first expiration occurs after a specified
// duration (1s), and whose subsequent expirations occur after
// a specified interval (2s)
timerService.createTimer(1000, 2000, "MyTimer");
}
@Timeout
public void timeout(Timer timer) {
System.out.println("Hi from " + timer.getInfo());
}
}
需要考虑的一些要点:
答案 1 :(得分:1)
您提供的代码示例无效,您将永远不会遇到程序化计时器。因为在这种情况下,bean可以具有最多一个超时方法。正如EJB规范中提到的,第18.2.5.1节:
...如果bean实现
TimedObject
接口,Timeout
注释或timeout-method
部署描述符元素只能是 用于指定ejbTimeout
方法。一个bean可以有最多一个 处理程序化计时器的超时方法。
顺便说一下,不是The Java EE 6 Tutorial中指定的自动定时器的情况:
自动计时器由企业的EJB容器创建 包含使用
@Schedule
或@Schedules
注释的方法的bean 注释已部署。企业bean可以具有多个 自动超时方法,与程序计时器不同,它允许 仅使用@Timeout
注释注释的一个方法 企业bean类。