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(); 
    } 
}