在Web应用程序的单独线程上编写

时间:2009-03-08 18:38:48

标签: java-ee jboss

对于我的客户端将要调用的其中一个URL,我希望它尽可能快地返回,中断最少,因此即使数据库停机或运行缓慢,请求仍然会很快返回。

我仍然需要对发送的数据进行一些处理,所以我正在考虑拥有一个单独的“队列”来保存数据,然后几乎实时处理,但是在一个单独的线程中。

在我开始编写此队列之前,我想询问是否有可用的类/库来执行此操作?

这是一个使用jboss部署的java Web应用程序。

6 个答案:

答案 0 :(得分:9)

强烈建议不要在J2EE应用程序中创建自己的线程,这超出了J2EE规范。我认为你不会找到一个可以做你想做的J2EE库。

J2EE的主要优点之一是服务器为您管理所有线程(和其他资源)。如果您开始创建自己的线程,服务器不会知道它们并且无法管理它们,因此您可能会在其他问题中面临潜在的资源泄漏问题。为了做一个短语,你不会得到一只狗并自己吠叫。

您最好尝试创建使用JMS的解决方案。 JMS是关于处理消息队列的所有内容,因此应该与您的要求很好地匹配。 Here's an article that talks about this a bit.

答案 1 :(得分:2)

JMS的替代方法是将请求保留在数据库中,然后与调度程序一起处理它们。您可以使用QuartzJava EE timers

答案 2 :(得分:1)

实际上,您可以使用commonj创建所需的主题。它提供了在Java EE容器中使用线程和计时器的轻量级方法。更多信息here以及此问题已多次提出。

这允许您确认Java EE中资源管理的限制,并避免JMS的更重量级解决方案(尽管它也可以工作)。

答案 3 :(得分:0)

这不是一个完全依赖Ajax的场景吗?您的长时间加载页面会立即返回,并包含一个javascript ajax请求以获取您的长处理请求。当请求处于待处理状态时,用户面临一个微调器或其他方式通知他,请求可能需要一些时间。一旦它返回,响应将通过javascript插入到您的页面中。

答案 4 :(得分:0)

我使用Doug Lea的PooledExecutor非常成功地处理了这类事情。现在还有ExecutorService直接在Java 5和更新版本中使用。

有一些评论强烈建议不要在J2EE中使用自己的线程。好吧,无论何时你自己穿线你都要小心,这真的没什么不同。我发现J2EE的方式让服务器处理一切有点令人不安的事情,并且不喜欢它限制你可以采取的设计选择的方式。

只差50美分......

答案 5 :(得分:0)

实现最终成为了一条JMS消息,还有一些消息驱动的Bean处理数据,这些数据运行良好,并且非常好用。

我感谢所有帮助和评论,特别是commonj,以及有关手动创建线程的警告。