2012-10-22 45 views
0

我有一個關於使用EJB定時服務的場景。使用EJB定時器服務執行外部服務

使用情況如下: 系統應該能夠安排一個任務,該任務將使用某個特定的時間戳查詢/詢問我們的Subversion存儲庫文件更改。

這個想法是,無論計劃任務即將運行,它都將執行鍼對特定svn存儲庫的命令。 對於這個特定的目的,我不會叫任何外部操作,而是會使用使用SVNKit Java庫http://svnkit.com/

我唯一擔心的就是這個的「純」的java方式: 是否使用EJB計時器是個好主意服務來執行將調用外部進程的任務?我的方式將使用'純'的java方式,但在其他情況下,例如直接調用批處理文件/命令行/外部可執行文件到定時器服務邏輯中。

我擔心的服務器內存使用/性能等

的影響這是一個好主意?

另一種想法是,我想在服務器上使用基於客戶端的技術(如SWT/Swing)創建一個'桌面'應用程序,它將執行輪詢並在那裏編寫邏輯,但這意味着我需要管理兩個應用程序。 「桌面」應用程序將輪詢我將在Glassfish中創建的'web'用戶界面。

我傾向於在我選擇的應用程序服務器中做所有事情,這是glassfish。

我以前使用過EJB Timer,但它只是在不調用任何extenral服務的情況下調用數據庫,只是這個場景出現了,所以我在這裏提出了一個問題,以便從那些有經驗的人那裏收集更多的想法。

有什麼想法?

+0

我一直在使用桌面應用程序實現第二個應用程序,並且有一個計劃任務使用jms發送消息。原因是桌面應用程序將在連接的客戶端上運行。這工作沒問題,我遇到的問題是部署客戶端應用程序,這本身就是一個領域。所以,如果你永遠不會有要求在不同的機器上運行,我不認爲這是值得的成本 –

回答

2

從理論上講,EJB是不應該依賴於外部I/O,因爲它與bean實例,線程的容器/服務器的管理等

實際上干擾,如果你採取預防措施,這應該工作。例如:

  • 隔離功能,以它自己的EJB(即無狀態會話Bean只處理這些定時器),以避免實例池的問題
  • 使用超時等待命令,以避免掛所有掛起的進程服務器線程
  • 保證你,讓你有多個操作系統命令同時

運行記住,EJB 3.0定時器是永久性的(不按期定時器VS EJB 3.1定時器,有是非的選項-persistent),這意味着:

  1. 它們可以在集羣中的任何服務器上運行。如果羣集中有多臺機器,則需要確保它們都能夠運行該命令。
  2. 它們在服務器重新啓動後仍然存在。如果您計劃一個計時器運行,但服務器在可能之前崩潰,它將在服務器重新啓動時運行。這可能會導致間隔定時器的特定問題(所有錯過的定時器將重複觸發),並且如果您不仔細管理現有時間(可以輕鬆創建冗餘定時器)。
+1

嗨,好的想法。另一方面,將創建一個Singleton EJB和@Startup加上日程表達式將解決上述問題?我在想,因爲它是Singleton,並且在部署過程中會觸發,所以我將能夠解決上述問題。謝謝 –

+0

您使用了ejb-3.0標記(vs ejb-3.1),所以我不知道您是否可以使用EJB 3.1功能。是的,使用'@ Singleton'解決了許多問題,如果你使用'@Schedule(persistent = false)'(顯然具有時間屬性),你甚至不需要'@ Startup'。 –

+0

謝謝......我實際上可以使用任何東西..至於EJB 3.0或EJB 3.1,我不確定這一點,因爲在EJB方面我仍然是學習者。但感謝您的想法,我將使用@Singleton註釋加上刪除StartUp的Schedule。 –