如何在Java EE中启动后台进程

时间:2009-06-25 20:42:52

标签: java java-ee ejb

我想在Java EE(OC4J 10)环境中启动后台进程。用“新线程”启动一个线程似乎是错误的但是我找不到一个好方法。

在我的特殊情况下使用JMS队列很困难,因为此方法调用的参数不可序列化。

我还想过在会话bean上使用onTimeout计时器方法,但这不允许我传递参数(据我所知)。

是否有任何“正典”方式来处理此类任务,或者我只需要恢复为“新主题”或java.concurrent.ThreadPool

7 个答案:

答案 0 :(得分:14)

Java EE通常会尝试从开发人员的关注点中删除线程。 (它在这方面的成功是一个完全不同的主题)。

JMS显然是处理此问题的首选方法。

对于大多数参数,您可以选择强制或伪造序列化,即使它们在默认情况下不可序列化也是如此。根据数据,考虑将其包装在可重新加载数据的可序列化对象中。这显然取决于参数和应用。

答案 1 :(得分:3)

JMS是Java EE的做法。如果容器允许,您可以启动自己的线程,但这确实违反了Java EE规范(您可能会也可能不关心这一点)。

如果您不关心Java EE通用合规性(如果您实际上是在使用线程而不是处理JMS),那么Oracle容器肯定会有专有的方法来执行此操作(例如{{3} })。

答案 2 :(得分:1)

不详细了解OCJ4,但我使用Thread方法和java.util.Timer方法在基于Tomcat的应用程序中执行某些任务。在Java 5+中,可以选择使用Executor服务之一(Sheduled,Priority)。

我不知道onTimeout,但你可以在会话本身,应用程序上下文或静态变量中传递参数(有人说不鼓励)。但该名称告诉我,当用户的会话超时并且您想要进行一些清理时会调用它。

答案 3 :(得分:1)

使用JMS是正确的方法,但它的重量更重。

您获得的优势是,如果您需要多台服务器,一台服务器或其他服务器,一旦配置了服务器,您的“线程”现在可以分发到多台计算机。

这也意味着您不希望为真正无足轻重的工作量或大量数据发送消息。选择你的界面点。

答案 4 :(得分:1)

请点击此处获取更多信息: stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee-container-is-discouraged

我一直在容器(Tomcat,JBoss)中创建线程没有问题,但它们是非常简单的队列,我不依赖于集群。

但是,EJB 3.1将引入您可能会觉得有用的异步调用: http://www.theserverside.com/tt/articles/article.tss?track=NL-461&ad=700869&l=EJB3-1Maturity&asrc=EM_NLN_6665442&uid=2882457

答案 5 :(得分:1)

Java EE并不是真的禁止你创建自己的线程,而是EJB规范说不允许“非托管线程”。原因是应用程序服务器不知道这些线程,因此容器无法管理这些线程上的安全性和事务。

然而,有很多框架可以创建自己的线程。例如Quartz,Axis和Spring。改变是你已经使用其中一个,所以只要你意识到后果,创建自己的线程并不是那么糟糕。这就是说我同意其他人的观点,即使用JMS或JCA优先于手动创建线程。

顺便说一句,OC4J允许您创建自己的线程。但是,它不允许来自这些非托管线程的JNDI查找。您可以通过指定 -userThreads 参数来禁用此限制。

答案 6 :(得分:0)

我来自.NET背景,而JMS对我来说似乎相当重要。相反,我推荐Quartz,它是Java和JEE应用程序的后台调度库。 (我在ASP.NET MVC应用程序中使用了Quartz.NET并取得了很大的成功。)