2012-10-29 137 views
0

我在EJB無狀態上使用JBoss AS 7和Schedule方法。我的問題是即使是EJB也是無狀態的,它保持其狀態,這給我帶來了麻煩。這裏是例子:使用EJB的無狀態EJB保持狀態時間表

定時器:

@Stateless 
public class TestTimer { 

    @Inject HelloWorldService helloWorld; 

    @SuppressWarnings("unused") 
    @Schedule(second="*/10", minute="*", hour="*", info="MyTimer") 
    private void execute() { 
     System.out.println(helloWorld.sayHello()); 
     System.out.println(this.toString() + " "+ helloWorld.toString()); 
    } 
} 

注入的HelloWorldService:

public class HelloWorldService { 

    public String sayHello() { 
     return "Hello World!"; 
    } 
} 

我期待該行System.out.println(this.toString() + " "+ helloWorld.toString());將每一次打印一個不同的時間定時器運行,因爲它每次都會有一個新的TestTimer實例,但我錯了:

16:43:50,003 INFO [stdout] (EJB default - 3) [email protected] [email protected] 
16:44:40,022 INFO [stdout] (EJB default - 1) [email protected] [email protected] 

我做錯了什麼,這是預期的行爲,還是什麼?

回答

1

重要的是,每個計時器有一個查找,您可能會收到豆
, 的不同實例,但「可以」的意思,你還可以得到相同的情況下,因爲它是由豆子
池獲得 容器爲您管理。
只要它提供了正確的功能,使用相同的計時器對象
沒有任何問題。
這意味着作爲開發人員,您無法對bean的狀態進行任何假設,並且在bean的新查找時是否會恢復它。

+0

所有這些都是很好的答案,並幫助我瞭解一些有關我的問題。我會接受你的,因爲它更好地描述了案件 – Montolide

+0

很高興我可以幫助你! –

1

EJB規範沒有聲明無狀態bean 在每次調用後都放棄了它們的狀態。它指出,應用程序開發人員不得依賴保持其狀態的bean 。有一個微妙的,但非常重要的區別。同一個bean實例可能會被多次使用;這並不否定無國籍。

1

這是預期的行爲(根據Java EE規範),實際上比這更復雜一點。

應用程序服務器正在管理一個staless會話bean池,並使用此池中的實例來服務器客戶端請求。如果你在服務器上有一些負載,那麼將從池中使用幾個bean,並且每個bean都會有自己的狀態。所以,在你的測試中,你會結束有時打印相同的字符串值,有時會打印另一個字符串值。

您不應該使用業務邏輯的屬性。但是,將屬性用於技術目的(例如,保留對數據庫的引用)有時是一個好主意。

1

容器有一個無狀態會話bean池。 容器內部處理活動實例的數量(據我所知) 對於你的情況,計時器調用似乎相同的實例。