我正在创建一个从MySQL数据库获取信息的学校Web应用程序。我希望后端定期删除带有已在数据库中过期的时间戳的条目。
根据我的研究,我创建了一个TimerSessionBean,每小时都有一个Schedule annotation来删除数据库中的条目。为了测试,现在我只是想让豆子在5分钟内打印出来。这就是我到目前为止所做的:
import javax.ejb.Schedule;
import javax.ejb.Stateless;
import java.util.Date;
@Stateless
public class TimerSessionBean {
@Schedule(minute = "*/5")
public void PrintTime() {
System.out.println("Current: " + new Date());
}
}
但是,部署应用程序时没有任何反应。仅仅创建TimerSessionBean并包含Schedule注释是不够的?
答案 0 :(得分:0)
TimerSessionBean是一个单例会话bean,它显示如何设置自动计时器和程序计时器。
在随后的TimerSessionBean的源代码清单中,setTimer和@Timeout方法用于设置编程计时器。
创建bean时,容器会注入TimerService实例。因为它是一个业务方法,所以setTimer会暴露给TimerSessionBean的本地无接口视图,并且可以由客户端调用。
在此示例中,客户端调用setTimer,间隔持续时间为30,000毫秒 setTimer方法通过调用TimerService的createTimer方法创建一个新的计时器 现在设置了计时器,EJB容器将在计时器到期时调用TimerSessionBean的programmaticTimeout方法,大约30秒。
package timersession.ejb;
import java.util.Date;
import javax.annotation.Resource;
import javax.ejb.Schedule;
import javax.ejb.Stateless;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;
@Singleton
public class TimerSessionBean {
@Resource
TimerService timerService;
private Date lastProgrammaticTimeout;
private Date lastAutomaticTimeout;
public void setTimer(long intervalDuration) {
System.out.println("Setting a programmatic timeout for "
+ intervalDuration + " milliseconds from now.");
Timer timer = timerService.createTimer(intervalDuration,
"Created new programmatic timer");
}
@Timeout
public void programmaticTimeout(Timer timer) {
this.setLastProgrammaticTimeout(new Date());
System.out.println("Programmatic timeout occurred.");
}
@Schedule(minute="*/5", hour="*")
public void automaticTimeout() {
this.setLastAutomaticTimeout(new Date());
System.out.println("Automatic timeout occured");
}
public void setLastProgrammaticTimeout(Date lastTimeout) {
this.lastProgrammaticTimeout = lastTimeout;
}
public void setLastAutomaticTimeout(Date lastAutomaticTimeout) {
this.lastAutomaticTimeout = lastAutomaticTimeout;
}
[...]
要查看输出JAVA Console
必须打开。