[英]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.