如何在 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
您有一些选择:
- 异步bean。正如你提到的,这些是 vendor-specific。
- commonj 几乎没有 vendor-specific。据我所知,它仅由 IBM WebSphere Application Server 和 BEA WebLogic 实现。 API 已被 Concurrency Utilities for Java EE 有效取代,这确实是最佳选择。
- EJB
@Asynchronous
方法。需要使用 EJB(对某些人来说是不需要的复杂性)。
- EJB 计时器。需要使用 EJB,需要可序列化的数据。
- JMS。可能需要使用 MDB 来接收消息,需要可序列化的数据。
- 实际创建线程。 EE 规范不建议这样做,但只要您不尝试使用 EE 构造(
lookup("java:...")
、JPA、UserTransaction 等),那么您应该没问题。
如果您需要确保所有日志条目都已安全写入,那么您可能应该使用带有持久消息的 JMS。否则,您可以使用 @Asynchronous
EJB 方法。
我有一个要求,我必须在 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
您有一些选择:
- 异步bean。正如你提到的,这些是 vendor-specific。
- commonj 几乎没有 vendor-specific。据我所知,它仅由 IBM WebSphere Application Server 和 BEA WebLogic 实现。 API 已被 Concurrency Utilities for Java EE 有效取代,这确实是最佳选择。
- EJB
@Asynchronous
方法。需要使用 EJB(对某些人来说是不需要的复杂性)。 - EJB 计时器。需要使用 EJB,需要可序列化的数据。
- JMS。可能需要使用 MDB 来接收消息,需要可序列化的数据。
- 实际创建线程。 EE 规范不建议这样做,但只要您不尝试使用 EE 构造(
lookup("java:...")
、JPA、UserTransaction 等),那么您应该没问题。
如果您需要确保所有日志条目都已安全写入,那么您可能应该使用带有持久消息的 JMS。否则,您可以使用 @Asynchronous
EJB 方法。