0

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

我的应用程序将需要发送的电子邮件放在数据库的通知表中。

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

什么是适当的 Java EE 技术可以使这每 5 或 10 分钟发生一次?Java EE 中是否有某种“定时器进程”可用?

任何信息都很有用,谢谢!抢

4

5 回答 5

3

Quartz Scheduler是一个很好的库。

于 2012-05-29T14:24:51.523 回答
3

您可以为此目的使用@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");
    }

}
于 2012-05-29T14:43:05.280 回答
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 上。

于 2012-05-29T14:50:31.120 回答
0

如果你不需要任何非常花哨的东西,你可以安排任务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);
于 2012-05-29T14:34:18.260 回答
0

Quartz 非常好,但是 Java EE 规范现在包括 EJB 计时器,它可能适合您的需要。

于 2012-05-29T14:27:16.500 回答