2011-04-17 107 views
1

在消息驅動Bean我是僅限於會話Bean的同樣的規則(EJB3或EJB3.1),即:消息驅動Bean(MDB)與其他EJB Bean綁定到相同的限制嗎?

  • 使用java.lang.reflect中的Java反射API來訪問的方式不可用的信息的Java運行時環境
  • 讀或寫非最終靜態字段
  • 使用這指的是例如在方法參數或導致
  • 訪問包(和類),它們另有不可用的安全規則Java編程語言規則
  • 在包中定義類
  • 使用java.awt包來創建用戶界面
  • 創建或修改的類加載器和安全管理器
  • 重定向的輸入,輸出和錯誤流
  • 獲得安全策略對於代碼源
  • 訪問信息或修改安全配置對象
  • 創建或管理線程
  • 使用線程同步ronization元同步與其他企業bean實例訪問
  • 停止Java虛擬機
  • 負載的本地庫
  • 監聽,接收組播上的連接,或從網絡套接字在Java中
  • 變化套接字工廠。 net.Socket或java.net.ServerSocket,或更改java.net.URL的流處理程序工廠。
  • 直接讀取或寫入文件描述符
  • 創建,修改,或在文件系統中
  • 使用Java序列化協議

回答

2

的子類和對象替換功能它始終是一個好主意,刪除文件不要手動創建線程(ExecutorService在某些情況下似乎很好)。

實際上,MDB經常用於解決這個限制:不是創建一個單獨的線程,而是發送一些任務對象(將MyJob extends Serializable放入ObjectMessage中)放入隊列,並讓它在MDB線程池中執行。這種方法更重量級,但擴展性非常好,而且您不必手動管理任何線程。在這種情況下,JMS只是異步運行作業的一種奇特方式。

+0

我面臨的問題是我創建了一個應用程序,提供插件的第三方開發人員。其中一些插件使用Apache HTTP Client,它通常用於多線程模式。此時此代碼在無狀態會話Bean中執行,但由於HTTP客戶端中的線程操作,應用程序將突然凍結並將不得不重新啓動應用程序服務器。不知道如何解決這個問題,因此我在尋找JMS/MDB – 2011-04-17 18:40:37

0

這些EJB限制通常不是硬限制。事實上,他們不是在做你的EJB 工作適當的警告,他們更像是如何使你的EJB 便攜式跨EJB容器公告。

有時候,一些非常挑剔的EJB容器提供者(咳嗽.... WebSphere ...咳嗽)實際上會通過java安全策略強制執行這些限制,但我會說大約有一半限制被忽略(我的意思是在您的MDB中使用log4j可能違反其中約30%)。

違反其他70%可能表示一些架構或設計問題。

那麼,你可以在MDB中調用System.exit()answer是的,但只有一次... :)

這聽起來像,在你的情況下,你需要這些限制可能會導致可能行爲不端的插件。我不知道MDB是否會讓你擺脫這個問題。我認爲這取決於你對第三方開發者的信任程度,而不是在EJB中使用基於調用的模型,而是將組件安裝爲JMX ModelMBeans。您可以使用java安全模型來限制他們可以做的事情,但我認爲這會挫敗目的。

也許使用一些運行(或加載)時間的AOP字節代碼工程,您可以重寫所有線程請求以重定向到您分配的每個組件線程工廠,並限制可創建的線程。因爲您不想阻止他們做他們所做的任何事情,所以您不希望他們在崩潰/失速/行爲不當時取下整個服務器。

有趣的問題。