@日程
如果您使用的是 Ejb 3.1 (glassfish 3.x),您可以使用 @Schedule 注释让容器在指定的时间间隔或给定的日历时间调用方法。允许您避免在自己的代码中处理线程
阅读有关 ejb 3.1 计时器的信息
@Stateless
public class LabbBean {
@EJB
WorkerEjb workerEjb;
@Schedule(second="*/5", minute="*",hour="*", persistent=false)
public void myMethod() {
for (all jobs found in db){
workerEjb.workerMethod(job);
}
}
}
@Stateless
public class WorkerEjb {
@Asynchronous
public void workerMethod(job) {
//Send emails
}
}
如果你想在单独的线程中完成工作,@Schedule 注释方法可以调用一个 worker-ejb,其中 worker-method 注释为 @Asynchronous
@超时
我刚刚意识到您希望从数据库启动计划。一个选项是使用带有@Startup 注释的@Singleton ejb 以编程方式启动一堆计时器。如果某些计时器同时用完,则将在单独的线程中调用超时注释方法。
@Singleton
@Startup
public class LabbBean {
@Resource
protected TimerService timerService;
@PostConstruct
public void init() {
//Init your timers from the data in the database here
for (all your timers) {
TimerConfig config = new TimerConfig();
config.setInfo("timer1");
config.setPersistent(false);
ScheduleExpression schedule = new ScheduleExpression();
schedule.dayOfMonth(10);
schedule.minute(2);
timerService.createCalendarTimer(schedule, config);
}
}
//method called when timeout occurs
@Timeout
public void timeoutHandler(Timer timer) {
String name = timer.getInfo().toString();
System.out.println("Timer name=" + name);
}
}