在我正在处理的 JSF-2 应用程序中,当用户执行操作时,我需要启动服务器端 Timer。
此计时器必须与应用程序本身相关,因此它必须在用户会话关闭时仍然存在。
为了解决这个问题,我想使用 java.util.Timer 类在 Application 范围的 bean 中实例化计时器对象。
这会是一个好的解决方案吗?还有其他更好的方法来实现这一目标吗?谢谢
问问题
2667 次
1 回答
3
没有 ejb 容器
如果您的容器没有 ejb 功能(tomcat、jetty 等),您可以使用石英调度程序库:http: //quartz-scheduler.org/
他们也有一些不错的代码示例:http: //quartz-scheduler.org/documentation/quartz-2.1.x/examples/Example1
EJB 3.1
如果您的应用服务器具有 EJB 3.1(glassfish、Jboss),则有一种创建计时器的 java ee 标准方法。主要看@Schedule 和@Timeout 注解。
这样的事情可能会涵盖您的用例(当计时器用完时,将调用带注释的 @Timeout 方法)
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;
@Stateless
public class TimerBean {
@Resource
protected TimerService timerService;
@Timeout
public void timeoutHandler(Timer timer) {
String name = timer.getInfo().toString();
System.out.println("Timer name=" + name);
}
public void startTimer(long initialExpiration, long interval, String name){
TimerConfig config = new TimerConfig();
config.setInfo(name);
config.setPersistent(false);
timerService.createIntervalTimer(initialExpiration, interval, config);
}
}
于 2012-12-07T12:38:13.397 回答