我在 WebSphere 7 上有一个 Java EE 应用程序。
我的应用程序将需要发送的电子邮件放在数据库的通知表中。
我想编写每 5 或 10 分钟触发一次的代码,并扫描通知表以查找状态为“PENDING”的条目,发送电子邮件,然后将状态更新为“SENT”。
什么是适当的 Java EE 技术可以使这每 5 或 10 分钟发生一次?Java EE 中是否有某种“定时器进程”可用?
任何信息都很有用,谢谢!抢
我在 WebSphere 7 上有一个 Java EE 应用程序。
我的应用程序将需要发送的电子邮件放在数据库的通知表中。
我想编写每 5 或 10 分钟触发一次的代码,并扫描通知表以查找状态为“PENDING”的条目,发送电子邮件,然后将状态更新为“SENT”。
什么是适当的 Java EE 技术可以使这每 5 或 10 分钟发生一次?Java EE 中是否有某种“定时器进程”可用?
任何信息都很有用,谢谢!抢
Quartz Scheduler是一个很好的库。
您可以为此目的使用@Schedule 注释。
JavaEE 6 为此提供了 Timer 服务
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");
}
}
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 上。
如果你不需要任何非常花哨的东西,你可以安排任务java.util.concurrent.Executors
public class Foo implements Runnable(){
public void run(){
//do stuff
}
}
并安排每t毫秒运行d延迟秒
Executors.newScheduledThreadPool(10).scheduleAtFixedRate(new Foo(), d, t, TimeUnit.MILLISECONDS);
Quartz 非常好,但是 Java EE 规范现在包括 EJB 计时器,它可能适合您的需要。