什么是适当的Java EE技术来做一个定时的“cron工作”?

时间:2012-05-29 14:23:58

标签: email java-ee

我在WebSphere 7上有一个Java EE应用程序。

我的应用会将需要发送的电子邮件发送到数据库中的通知表中。

我想编写每隔5或10分钟触发的代码,并扫描通知表以查找状态为“PENDING”的条目,发送电子邮件,然后将状态更新为“SENT”。

适当的Java EE技术是每隔5或10分钟实现这一目标的? Java EE中是否有某种“计时器进程”可用?

任何信息都很有用,谢谢! 罗布

5 个答案:

答案 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);