【问题标题】:Jboss Service / Managed Bean QuestionJboss 服务/托管 Bean 问题
【发布时间】:2009-10-28 22:19:36
【问题描述】:

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

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

谢谢,

斯科特

【问题讨论】:

  • 您是否将 EJB 中的 EntityManager 作为@PersistenceContext 获取?
  • 是的,我愿意。经过大量研究,我发现 EntityManager 不是线程安全的,因此不能在子线程中使用/访问。

标签: jboss service entitymanager jmx


【解决方案1】:

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

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

【讨论】:

  • 这是我设置它的原始方式,但是漫长的过程会使 MDB bean 和/或 EJB 超时。我最终发现的是一种注释 EJB 的方法,这样它就不会超时。
【解决方案2】:

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

@PoolClass(value=org.jboss.ejb3.StrictMaxPool.class, timeout=360000000L)

【讨论】:

  • 超时时间是 3600 秒 * 1000 毫秒 * 100 小时???那是您拥有的一些长期运行的 bean ;-)
猜你喜欢
  • 2012-09-20
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
相关资源
最近更新 更多