@Schedule
如果使用EJB 3.1(glassfish的3.x的),则可以使用@Schedule注解为具有容器在指定的时间间隔或在给定的日历时间调用的方法。让您避免处理线程在自己的代码
Read about ejb 3.1 timer
@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注解的方法可以调用一个工人的EJB与注释的工人方法作为@Asynchronous
@Timeout
我才意识到你想要的时间表,从数据库开始。一个选项是使用带有@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);
}
}
什么是理解你的问题的最佳做法:-)?与* WebSTart Web应用程序等客户端*全部在一个包*,*我的新服务需要运行在一个单独的线程* – vels4j
我想我可以说得更清楚。 在一个WAR文件中将所有内容上传到GlassFish服务器。从服务器逻辑到客户端的所有内容都在该文件中,实现这一点会很好,这种方法也是很好的... –