我在JBOSS中运行了一个托管bean /服务。然后,我有一个石英作业偶尔会唤醒并调用托管bean的方法。这个方法有时很长,并且由于我不希望石英作业超时,我在托管bean中实现了一个线程来执行处理。线程完成后,我需要用结果更新数据库表。这是一个非常连续的过程,需要基于一些业务规则等。
我的主要问题是我可以在服务中使用EntityManager而不会出现问题但是我无法在线程中使用它,我得到一个NullPointerException。解决这个问题的最佳方法是什么?
谢谢,
斯科特
答案 0 :(得分:0)
由于不鼓励在appservers中创建线程,我会稍微修改一下设置。
我将处理的核心移动到消息驱动的bean,并让Quartz作业只是向MDB正在侦听的队列发送消息。反过来,MDB可以调用您的EJB,就像这样,一切都保持在标准允许的范围内。
答案 1 :(得分:0)
根据文档和规范,实体管理器不是线程安全的,不能像我最初想到的那样在不同的子线程中使用。我最终回到原始设计,类似于fvu提供的设计,但是我找到了一些注释,允许我修改超时时间并允许长时间运行的进程正常工作。这是我使用的注释:
@PoolClass(value=org.jboss.ejb3.StrictMaxPool.class, timeout=360000000L)