2012-05-23 96 views
2

我刚刚听说在JavaEE容器中产生自己的线程是一种不好的做法。自从我几个月前开始学习JavaEE 6开发以来,我一直这样做了一段时间。我一直在做的是:JavaEE容器中的异步任务

1)从Web应用程序的主入口点(对象实现了ServletContextListener),

2)我创建的线程夫妇运行的Web应用程序的一些异步背景任务在contextInitialized方法中的后端。

3.)我在contextDestroyed方法中清理资源。

有没有更好的方法来做到这一点?如何在不产生线程的情况下创建异步背景任务?什么是不使用线程的原因?

我使用EJB 3.0和JavaEE6

+0

我很想听听人们对此有何评论。我相信规范说你不应该从EJB产生线程,所以我不确定你是否做错了什么(一个servlet不是EJB)。使用线程的替代方法是使用EJB计时器。您还应该提及您使用的EJB版本。 – jahroy

回答

4

手动关闭产卵线程的确是一个不好的做法,因为你希望你的Java容器来管理你为你的线程池,外部应用程序代码。 JavaEE 6专门为此注释了一个名为@Asynchronous的注释,Oracle有一个official tutorial

2

在EJB3.1之前,解决方法是创建JMS和MDB以在EJB容器中执行异步作业,而EJB容器相对较重,并且依赖于消息代理。 @Asynchronous提供了一种更简单的方式来处理异步作业。

0

在Java EE 7中,我们看一下新的Concurrency Utils API规范。