我想在Java EE(OC4J 10)环境中启动一个后台进程。使用“new Thread”启动线程似乎是错误的做法,但我找不到更好的方式。
在我的特殊情况下,使用JMS队列很困难,因为我的方法调用参数不可序列化。
我还考虑过在会话bean上使用 onTimeout
定时器方法,但这样做不能传递参数(据我所知)。
是否有任何"标准"的方法来处理这样的任务,或者我只能退回到 "new Thread" 或 java.concurrent.ThreadPool
。
我想在Java EE(OC4J 10)环境中启动一个后台进程。使用“new Thread”启动线程似乎是错误的做法,但我找不到更好的方式。
在我的特殊情况下,使用JMS队列很困难,因为我的方法调用参数不可序列化。
我还考虑过在会话bean上使用 onTimeout
定时器方法,但这样做不能传递参数(据我所知)。
是否有任何"标准"的方法来处理这样的任务,或者我只能退回到 "new Thread" 或 java.concurrent.ThreadPool
。
Java EE通常试图将线程处理从开发者的担忧中移除。(它在这方面的成功是一个完全不同的话题)。
JMS显然是处理这个的首选方法。
对于大多数参数,即使它们默认情况下不可序列化,您也可以选择强制或伪造序列化。根据数据,考虑将其包装在可重新加载数据的可序列化对象中。这显然取决于参数和应用程序。
虽然我不太了解OCJ4,但我在基于Tomcat的应用程序中使用了线程方法和java.util.Timer方法来执行某些任务。在Java 5+中,有一个选项可以使用其中一个Executor服务(Sheduled,Priority)。
我不知道onTimeout是什么,但您可以在会话本身、应用程序上下文或静态变量中传递参数(有些人可能会说这是不鼓励的)。但是名称告诉我它在用户会话超时并且您想要进行一些清理时被调用。
使用JMS是正确的方法,但它更加重量级。
你得到的优势是,如果你需要多个服务器、一个服务器或任何其他配置,一旦服务器配置完成,你的“线程”现在可以分布到多台机器上。
这也意味着你不想为了微不足道的工作量或大量数据发送消息。选择好你的接口点。
这里有一些更多的信息: 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
Java EE并不真正禁止您创建自己的线程,而是EJB规范说“未管理的线程”不允许。原因是这些线程对应用服务器来说是未知的,因此容器无法在这些线程上管理诸如安全性和事务等内容。
尽管如此,有很多框架可以创建自己的线程。例如Quartz、Axis和Spring。改变已经使用其中之一,因此只要您意识到后果,创建自己的线程并不那么糟糕。话虽如此,我同意其他人的观点,即使用JMS或JCA优于手动线程创建。
顺便说一下,OC4J允许您创建自己的线程。但是它不允许从这些未管理的线程中进行JNDI查找。您可以通过指定-userThreads参数来禁用此限制。