[英]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 中的任何方法。
可以创建一个将minSize
和maxSize
设置为 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.