2

我正在尝试在集群环境中设置 Jboss 6,并使用它来托管集群有状态单例 EJB。

到目前为止,我们成功地在集群中安装了一个 Singleton EJB,我们的应用程序的不同入口点(通过部署在每个节点上的网站)指向托管 EJB 的单个环境(从而保持静态变量的状态)。我们使用以下配置实现了这一点:

豆接口:

@Remote
public interface IUniverse {
  ...
}

豆实现:

@Clustered @Stateful
public class Universe implements IUniverse {
  private static Vector<String> messages = new Vector<String>();
  ...
}

jboss-beans.xml 配置:

<deployment xmlns="urn:jboss:bean-deployer:2.0">
    <!-- This bean is an example of a clustered singleton -->
    <bean name="Universe" class="Universe">
    </bean>
    <bean name="UniverseController" class="org.jboss.ha.singleton.HASingletonController">
        <property name="HAPartition"><inject bean="HAPartition"/></property>
        <property name="target"><inject bean="Universe"/></property>
        <property name="targetStartMethod">startSingleton</property>
        <property name="targetStopMethod">stopSingleton</property>
    </bean>
</deployment>

这种实现的主要问题是,在主节点(包含单例 EJB 状态的节点)正常关闭后,单例的状态会丢失并重置为默认值。请注意,所有内容都是根据 JBoss 5 Clustering 文档构建的,因为没有找到关于此主题的 JBoss 6 文档。任何关于如何解决这个问题或在哪里可以找到关于集群的 JBoss 6 文档的信息都非常感谢。

4

1 回答 1

1

我认为您实际上不需要“单例”有状态会话 bean,因为调用有状态会话 bean 的方法是保留对 bean 的引用并调用相同的引用实例。应用服务器集群将通过维护跨集群的 ejb 会话来维护有状态会话 bean 的状态。

但最后,我同意您可能需要重新考虑使用有状态会话 bean 的必要性。

于 2012-01-08T23:41:45.477 回答