2012-08-23 20 views
3

使用CDI bean(使用Myfaces CODI)代替JSF managed beans一段時間以來,我一直在瀏覽一些教程以更好地理解我可以做什麼真的用這個技術做。最明顯的開發潛力是CDI事件模型,但對於我可以使用它的靈感來說,我沒有太多靈感。JSF應用程序中CDI事件的常見使用案例

我有一個頁面計數器機制,它保持頁面訪問的持久記錄,而無需訪問關鍵路徑上的數據庫,即減緩頁面加載時間。這是通過在由AtomicReference訪問的ConcurrentHashMap中增加一個AtomicInteger來實現的,數據存儲在單例EJB中。然後,EJB定時器定期「抓取」地圖,將其替換爲新地圖,並將新匹配添加到相應的數據庫記錄。 PreDestroy偵聽器在應用程序服務器關閉時保存任何非持久更新。

我想在頁面加載我剛剛火與應用「頁面訪問」事件範圍的CDI豆觀察,並做後端處理,但是這達不到現有的設計在幾個方面:

  • 目前更新成批,定時器方法每隔幾分鐘運行一次。

  • 雖然現有設計會在服務器電源故障時丟失數據,但這是不可取的但可以接受的,但它處理正常關機的合理可靠性。

我需要更好地瞭解發生了什麼排隊CDI事件的情況下,說一個服務器關閉,我將通過規範摸不着頭腦。

雖然我會很感激上述想法是什麼,我在是由在您使用CDI事件在JSF應用程序的任何有趣的場景啓發真正感興趣的任何意見,任何人都關心,分享他們的經驗?

謝謝。

回答

1

首先事件是同步的,不是異步的。這意味着你顯然不能像JMS那樣使用它們,並且如果服務器停止,沒有任何事情可以進行故障切換。

事實上的唯一原因 - 我所知道的 - 爲什麼事件機制已經出臺是類型安全方式去耦元件(但是這是一個不錯的理由:)

之一我遇到的最優雅的場景是Seam Catch(現在注塑成Seam Solder)。請點擊這裏查看this的描述。那事件驅動的異常處理的想法是,讓不同的參與者(又名:CDI模塊和用戶代碼)自行報名異常通知。然後這個事件在註冊觀察者鏈上下起伏,並將使用固有的CDI機制來自動找到最合適的處理程序。

最好如果您閱讀文檔/檢查自己的源代碼。

+0

謝謝,這是我不知道的重點,我已經運行了一些測試,並看到它發生。 – Oversteer

3

您可以使用CDI事件在JSF應用程序如下usecases:

  • 火/當用戶想要登錄觀察事件/註銷
  • 火/觀測活動時,用戶更改區域
  • 火/觀察活動時,用戶更改主題

您的使用情況,您可以註釋EJB是負責用@Asynchronous存儲頁面視圖統計信息,以便在另一個線程中完成。那麼我認爲你的頁面加載速度不會減慢。

通常,您可以在使用舊事件/觀察者模式時使用CDI事件,但採用分離和優雅的方式加上DI功能。而且這種模式可以應用於各種各樣的用戶。

欲瞭解更多信息,請閱讀此博客。 link1link2

相關問題