2016-06-09 76 views
3

我最近一直在研究ejb,我也在閱讀有關定時器服務的內容,但即使我已閱讀了關於無狀態,有狀態和Singleton類型的會話Bean,但仍然有一些問題需要弄清楚定時器服務有一個多實例屬性。爲什麼EJB計時器服務使用Singleton作爲標準?

我已經看到了一些例子,甚至最簡單的使用Singleton會話Bean,所以,如果我要編寫一個簡單的程序來測試它,可以使用無狀態Bean或建議無論如何使用單身?另外,如果可能的話,我是否可以有無狀態不是最佳的情況?

回答

0

它採用單身的原因是至少2倍:

1.

只有單身有啓動初始化的能力。這意味着,您可以在應用程序啓動時註冊您的計時器服務。

2.

,如果它是使用無狀態bean,然後一個新的計時器服務將與每一個無狀態的bean設置服務請求註冊。單身保證只有一種你的計時器被註冊。想象一下,如果您無意中在無狀態bean中使用計時器,則會出現爭用或完整性問題或資金損失,然後在大致相同的時間創建1個以上的服務請求。

1

如果要確保在同一個基礎bean實例上調用所有超時回調,請使用單例。如果要在Bean實例本身中維護狀態,並且要確保一次只能調用一個超時回調(默認情況下,超時回調將使用單例的併發管理設置,默認情況下爲容器管理與一個寫鎖,所以一次只能調用一個單例方法)。

如果您想允許一次調用多個超時回調,請使用無狀態。如果同時發生多個超時回調,EJB容器將創建新的bean實例。

如果您希望配置非持久性計時器以在應用程序開始運行時開始運行,那麼您既可以對無狀態bean也可以使用@Schedule註釋,也可以使用@Singleton @Startup bean與@PostConstruct(如果你想要無狀態行爲,你可以將無狀態bean注入到無狀態bean中,並在啓動時在無狀態會話bean上調用createTimer)。