2014-11-14 89 views
0

我有一個應用程序連接到EJB來檢索一些數據。 EJB在單獨的EAR中。 該應用程序正在使用委託 - 單例模式來獲得與EJB的連接。問題是,EJB經常重新部署,因爲它仍在開發中,每次發生這種情況時,由於單例的getInstance方法一直返回一個空的遠程對象引用和連接,所以當EJB重新聯機時,我的應用程序最終斷開連接並無法重新連接不能重新建立,所以我必須重新部署我的客戶端應用程序才能重新連接。 有什麼辦法可以避免這種情況發生,那不涉及對每個請求進行查找?重啓後失去連接到EJB

public class Delegate 
{ 

... 

private DataStoreService getDataStoreServiceInterface { 

     ServiceLocator serviceLocator = ServiceLocator.getInstance();    
     return serviceLocator.getDataStoreService(); 
    } 

    public Data getData(){ 
    DataStoreService dataStoreService = getDataStoreServiceInterface(); 
    return dataStoreService.getData(); 
    } 

} 



public class ServiceLocator{ 

private static ServiceLocator instance = null; 

private DataStoreService dataStoreService = null; 

protected Context context; 

private ServiceLocator(){ 

context = new InitialContext(); 
dataStoreService = (DataStoreService)context.lookup(DataStoreService.class.getName()); 
} 

static public ServiceLocator getInstance(){ 

    if (instance == null) { 
     instance = new ServiceLocator(); 
    } 
    return instance; 
    } 
} 
+0

捕獲遠程EJB引用是一種常見的做法,效果很好,你應該檢查,如果你的服務器版本有與此問題有關的一些錯誤。 – 2014-11-14 17:44:19

回答

0

顯然,這是在Weblogic的10.3.6容器中的bug,我不得不刪除單邏輯來避免這個問題

+0

小心提供引用或更多信息?因爲這是一個非常低質量的答案。 – dimo414 2015-05-14 03:23:53

-1

不要使用singleton模式,而項目處於開發模式,所以每次調用getInstance時都會返回一個新實例。另外,在編寫獲取EJB實例的Class的方式中,您將遇到問題,因爲應用中只有一個線程可以調用該EJB,因爲在使用EJB時​​,沒有人可以使用該實例,並且在您的所有應用程序只使用同一個ejb的實例。

另一種方式,它使用Singleton會話Bean(EJB)而不是使用Singleton模式。

+0

「您將遇到問題,因爲應用程序中只有一個線程可以調用該EJB,因爲在使用EJB時​​,沒有人可以使用該實例」這完全是錯誤的,EJB不會以這種方式工作。我建議您閱讀關於遠程代理概念和ejb生命週期。 – 2014-11-15 14:13:15