我在WebSphere 7上有一个Java EE应用程序。
我的应用会将需要发送的电子邮件发送到数据库中的通知表中。
我想编写每隔5或10分钟触发的代码,并扫描通知表以查找状态为“PENDING”的条目,发送电子邮件,然后将状态更新为“SENT”。
适当的Java EE技术是每隔5或10分钟实现这一目标的? Java EE中是否有某种“计时器进程”可用?
任何信息都很有用,谢谢! 罗布
答案 0 :(得分:3)
Quartz Scheduler是一个很好的图书馆。
答案 1 :(得分:3)
您可以将@Schedule注释用于此目的。
JavaEE 6为此
提供了定时服务http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html
@ManagedBean
@Stateless(name="MyScheduledTaskClass")
public class MyScheduledTaskClass implements Serializable{
private Logger _log = Logger.getLogger(this.getClass());
@Schedule(minute="*/5") //minute="*/10" if you want every 10 minutes
public void executeTask(){
_log.info("Scheduled task started");
//Do some stuff here
_log.info("Scheduled task finished");
}
}
答案 2 :(得分:1)
WebSphere 7运行Java EE 5(我认为),所以在这方面你的选择有点受限。
您可以使用Quartz Scheduler之类的库,但必须小心将其连接到由容器管理的线程池。我相信默认情况下它只是自己创建线程,这在EJB中是完全禁止的(并且在Web容器中强烈反对)。
我发现了一篇很棒的博客文章,引导您完成在WebSphere上设置工作管理器池的配置:http://sanjsuya.wordpress.com/2012/01/19/asynchronousbean-was-spring-integration/
如果您正在使用Spring,那么您可以使用WorkManagerTaskExecutor轻松地将Quartz调度程序连接到此线程池。这里有一些关于它的Spring文档(注意,它来自Spring 2,但我确信你或多或少也会为Spring 3做类似的事情):http://static.springsource.org/spring/docs/2.0.x/reference/scheduling.html
编辑:我的建筑师正在略微畏缩(尽管你可能有充分的理由按照你的方式去做)。为什么要将电子邮件写入数据库而不是编写队列?这样,它们可以在接收系统的闲暇时进行处理,而且您不会将大量的后台工作重载到WebSphere上。答案 3 :(得分:0)
Quartz非常出色,但Java EE规范现在包含可满足您需求的EJB计时器。
答案 4 :(得分:0)
如果您不需要任何花哨的东西,可以使用java.util.concurrent.Executors
public class Foo implements Runnable(){
public void run(){
//do stuff
}
}
并计划使用 d 延迟秒来运行每个 t 毫秒
Executors.newScheduledThreadPool(10).scheduleAtFixedRate(new Foo(), d, t, TimeUnit.MILLISECONDS);