2009-10-28 76 views
0

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

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

感谢,

斯科特

+0

您是否在EJB中将EntityManager作为@PersistenceContext获得? – fvu 2009-10-28 22:34:30

+0

是的,我喜欢。经过大量研究后,我发现EntityManager不是线程安全的,因此不能在子线程中使用/访问。 – 2009-10-30 10:08:48

回答

0

在创建中appservers线程气馁,我会修改设置一个位。

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

+0

这是我设置它的原始方式,但是长进程会超时MDB bean和/或EJB。我所发现的是一种注释EJB的方法,以便它不会超时。 – 2009-10-30 10:11:51

0

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

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

超时时间为3600秒* 1000毫秒* 100小时?这是一个长期运行的bean,你有;-) – fvu 2009-10-30 10:32:28