簡體   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