5

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

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

因此,我开始阅读有关工作管理器的内容,并了解并尝试了 websphere application server 8.5 中的示例程序。

我使用了 websphere 中的 asynchbeans.jar,现在我很烦我正在编写特定于供应商的代码。

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

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

4

3 回答 3

7

你有一些选择:

  1. 异步bean。正如您所提到的,这些是特定于供应商的。
  2. commonj 几乎不是特定于供应商的。据我所知,它仅由 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 等),那么您应该没问题。
于 2016-01-14T16:21:03.227 回答
4

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

在此处查看 JDoc:

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

于 2016-01-14T11:30:44.813 回答
0

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

于 2016-01-15T10:09:51.773 回答