3

我正在使用一個vanilla JBossAS 6服務器和幾個項目來測試羣集JBoss環境的功能。我遇到的問題是,如果我將EJB引用從節點中的一個EJB(另一種類型的EJB)轉移到另一個節點中相同類型的實例,則在調用方法時拋出異常,指出 long_alphanumeric_key指定bean的密鑰未在緩存中註冊(InfinispanStatefulCache)。Singleton vs羣集中狀態遠程EJB引用

問題是,當我需要傳輸的對象上使用Singleton註釋而不是Stateful註釋時,傳輸的對象完美地工作,併成功地在共享EJB創建的服務器上調用共享EJB的方法。問題在於這種情況與HA-Singleton具有相同的缺陷。所有傳輸的引用都是通過HA-JNDI樹上的查找獲得的。

什麼我想要實現的一些見解:

我現在需要的是共享節點之間的有狀態EJB的單個實例,如HA-辛格爾頓。不使用HA-Singleton的原因是這種單例的狀態僅在集羣的主節點上進行,因此如果節點關閉或失敗,實例的狀態將丟失。

使用Stateful bean將允許我維護集羣上的狀態,從而防止節點上發生故障時的狀態丟失。我還沒有完全理解JBoss和Infinispan緩存如何工作,但據我所知,@Clustered註釋的有狀態bean的狀態會自動複製到羣集中。

我們已經警告過在當前JBoss版本中使用Singletons和HA-Singletons的問題,因此任何形式的文檔或模式都可以幫助解決這個設計變更。

此外,我將不勝感激任何文檔,可以提供我深入瞭解Infinispan緩存和JBoss羣集如何工作。到目前爲止,我一直在閱讀的內容與使用JBossCache而不是Infinispan的舊JBoss版本混合使用。

感謝IND提前,
德國

回答

2

不幸的是,JBoss的AS6或AS7還不支持羣集EJB單身 - 這就是你要找真的什麼,我想。 HA-Singleton將確保只有一個服務的實例在集羣的單個節點上才啓動。這看起來不像它符合你的用例。看起來你真的只需要分發EJB單例的狀態。 下面是我推薦的,使用本地EJB單例,但使用infinispan來存儲其分佈式狀態: *對於初學者,我建議您使用AS7而不是AS6,因爲Infinispan集成更成熟。 *在AS7中,您可以直接在Singleton中使用infinispan緩存。 例如

@Singleton 
public class MySingleton { 
    // This references the same infinispan cache container used for sfsb replication 
    @Resource(lookup="java:jboss/infinispan/container/ejb") 
    private CacheContainer container; 
    private Cache<?, ?> cache; 

    @PostContruct 
    public void init() { 
    // This will create a cache for use by this singleton 
    // Any state to be distributed should be stored in the cache. 
    this.cache = container.getCache(this.getClass().getName()); 
    } 

    @PreDestroy 
    public void destroy() { 
    this.cache.stop(); 
    } 
}