0

我在 JBOSS 内部运行了一个托管 bean/服务。然后我有一个石英作业,它偶尔会醒来并调用托管 bean 的方法。这种方法有时很长而且很冗长,而且由于我不希望石英作业超时,所以我在托管 bean 中实现了一个线程来执行处理。线程完成后,我需要用结果更新数据库表。这是一个非常连续的过程,它需要基于一些业务规则等。

我的主要问题是我可以在服务中毫无问题地使用 EntityManager,但是我不能在线程中使用它,我得到一个 NullPointerException。解决这个问题的最佳方法是什么?

谢谢,

斯科特

4

2 回答 2

0

由于不鼓励在应用服务器中创建线程,我会稍微修改一下设置。

我会将处理的核心移至消息驱动的 bean,并让 Quartz 作业将消息发送到 MDB 正在侦听的队列。MDB 反过来可以调用您的 EJB,就像这样,一切都在标准允许的范围内。

于 2009-10-28T22:30:06.333 回答
0

根据文档和规范,实体管理器不是线程安全的,并且不能像我最初想到的那样跨不同的子线程使用。我最终回到了与 fvu 提供的类似的原始设计,但是我发现了一些注释可以让我修改超时时间并允许长时间运行的进程正常工作。这是我使用的注释:

@PoolClass(value=org.jboss.ejb3.StrictMaxPool.class, timeout=360000000L)
于 2009-10-30T10:15:33.167 回答