3

我正在使用带有几个项目的 vanilla JBossAS 6 服务器来测试集群 JBoss 环境的功能。我遇到的问题是,如果我将 EJB 引用从节点中的一个 EJB(另一种类型)传输到另一个节点中相同类型的实例,则在方法调用时会引发异常,说明long_alphanumeric_key键指定的 bean 未在缓存中注册 (InfinispanStatefulCache)。

问题是,当在我需要传输的对象上使用单例注释而不是有状态注释时,传输的对象可以完美地工作,成功地在创建它的服务器上调用共享 EJB 的方法。问题是这种情况与 HA-Singleton 有相同的缺陷。之前通过在 HA-JNDI 树上查找获得的所有传输的引用。

关于我要实现的目标的一些见解:

我目前需要的是在节点之间共享有状态 EJB 的单个实例,例如 HA-Singleton。不使用 HA-Singleton 的原因是这种类型的单例的状态是专门维护在集群的主节点上的,所以如果节点关闭或失败,实例的状态就会丢失。

使用有状态 bean 可以让我维护集群上的状态,从而防止在节点故障时状态丢失。我还没有完全理解 JBoss 和 Infinispan 缓存是如何工作的,但据我所知,@Clustered 带注释的有状态 bean 的状态会自动复制到集群上。

我们已经被警告过在当前 JBoss 版本中使用 Singletons 和 HA-Singletons 的问题,所以任何类型的文档或模式来帮助解决这个设计变更都是受欢迎的。

另外,如果有任何文档可以让我深入了解 Infinispan 缓存和 JBoss 集群如何工作,我将不胜感激。到目前为止,我一直在阅读的材料与使用 JBossCache 而不是 Infinispan 的旧 JBoss 版本混合在一起。

提前致谢,
德语

4

1 回答 1

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();
  }
}
于 2012-02-13T17:57:36.710 回答