繁体   English   中英

在 EJB 3.0 中,未调用 PostConstruct

[英]In EJB 3.0 , PostConstruct not called

我希望每小时运行一次计划作业,计划作业在 EJB 3.0 无状态 session bean 中定义(bean class 用@Stateless 注释)。 我仅限于 EJB 3.0,所以我不能使用 @Singleton/@Schedule。 问题是 @PostConstruct 注释的方法来初始化在 EJB 3.0 session bean 中定义的计时器从未被调用。

我的应该每小时运行一次的计时器方法在无状态 session bean 中用 @Timeout 注释。

阅读它在 EJB 3.0 中所说的其他问题,session bean 是延迟创建的,即。 除非从 bean class 之外的代码调用 bean,否则永远不会调用 PostConstruct 注释方法。 如何从 bean 外部调用 bean 并确保在部署 Tomee EJB 容器时只调用一次?

bean 每小时只运行一次方法。 无需在本地或远程调用 bean 中的任何方法。

可以创建一个将minSizemaxSize设置为 1 的无状态容器。结果应该是 TomEE 会急切地将您的池填充到最小大小并且不超过所需的最大大小。

但是,您可能不希望为所有无状态 bean 设置该设置,因此您还需要显式声明使用默认设置的无状态容器。

<Container id="Default Stateless Container" type="STATELESS">
</Container>

<Container id="pizza" type="STATELESS">
    maxSize = 1
    minSize = 1
</Container>

我已经将第二个容器称为pizza ,而不是像singletons这样的描述性名称,所以很明显这个名称不是任何魔法——使用任何你喜欢的名称。 请注意容器声明的顺序很重要。 当有两个无状态容器时,默认情况下,TomEE 会将所有无状态 bean 放入第一个容器中,除非您另外指定。

为确保您的 bean 进入第二个容器,您需要在该 bean 的 jar 的META-INF/文件夹中打开一个openejb-jar.xml文件。 例如,如果 bean class 是com.example.Peperoni ,那么您可以像这样将它放入pizza容器中:

<?xml version="1.0"?>
<openejb-jar>
    <ejb-deployment ejb-name="Peperoni"
         deployment-id="Peperoni"
         container-id="pizza"/>
</openejb-jar>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM