如何在 Java EE 环境中创建线程?

How to create threads in Java EE environment?

我有一个要求,我必须在 table 中保存一些数据,并且保存可能需要一些时间。基本上我想坚持一个日志。我不希望执行等到持久完成。

我知道我必须使用线程来完成这项任务,而且我知道不鼓励在企业应用程序中创建线程。

所以我开始阅读有关 worker manager 的内容,理解并尝试了 websphere application server 8.5 中的示例程序。

我使用了来自 websphere 的 asynchbeans.jar,现在我为编写供应商特定代码而烦恼。

然后我遇到了在 oracle java 文档中描述的 commonj 工作 api。现在我正在考虑使用 fabric3 中的 commonj api。

我的疑问是,有没有更好的方法来完成同样的任务? EJB方式?或者工作经理适合我的要求?

JavaEE7有managed executor,你可以试试。您可以使用它生成任务,并在处理程序中接收托管回调。这是 EE 标准的一部分,应该与平台无关。

在此处查看 JDoc:

http://docs.oracle.com/javaee/7/api/javax/enterprise/concurrent/ManagedExecutorService.html

您有一些选择:

  1. 异步bean。正如你提到的,这些是 vendor-specific。
  2. commonj 几乎没有 vendor-specific。据我所知,它仅由 IBM WebSphere Application Server 和 BEA WebLogic 实现。 API 已被 Concurrency Utilities for Java EE 有效取代,这确实是最佳选择。
  3. EJB @Asynchronous 方法。需要使用 EJB(对某些人来说是不需要的复杂性)。
  4. EJB 计时器。需要使用 EJB,需要可序列化的数据。
  5. JMS。可能需要使用 MDB 来接收消息,需要可序列化的数据。
  6. 实际创建线程。 EE 规范不建议这样做,但只要您不尝试使用 EE 构造(lookup("java:...")、JPA、UserTransaction 等),那么您应该没问题。

如果您需要确保所有日志条目都已安全写入,那么您可能应该使用带有持久消息的 JMS。否则,您可以使用 @Asynchronous EJB 方法。