使用wildfly的java集群单例?

mspsb9vt  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(459)

我正在尝试创建一个简单的 Singleton wildfly 8.2版。我已经配置了两个wildfly示例,在独立的集群配置中运行。我的应用程序部署到这两个,我可以访问它没有问题。
我的集群ejb如下所示:

@Named
@Clustered
@Singleton
public class PeekPokeEJB implements PeekPoke {

    /**
     * Logger for this class
     */
    private static final Logger logger = Logger
            .getLogger(PeekPokeEJB.class);

    private static final long serialVersionUID = 2332663907180293111L;

    private int value = -1;

    @Override
    public void poke() {
        if (logger.isDebugEnabled()) {
            logger.debug("poke() - start"); //$NON-NLS-1$
        }

        Random rand = new SecureRandom();
        int newValue = rand.nextInt();
        if (logger.isDebugEnabled()) {
            logger.debug("poke() - int newValue=" + newValue); //$NON-NLS-1$
        }

        this.value = newValue;

        if (logger.isDebugEnabled()) {
            logger.debug("poke() - end"); //$NON-NLS-1$
        }
    }

    @Override
    public void peek() {
        if (logger.isDebugEnabled()) {
            logger.debug("peek() - start"); //$NON-NLS-1$
        }

        if (logger.isDebugEnabled()) {
            logger.debug("peek() - value=" + value); //$NON-NLS-1$
        }

        if (logger.isDebugEnabled()) {
            logger.debug("peek() - end"); //$NON-NLS-1$
        }
    }
}

…我编写了一个非常简单的restful服务,让我通过浏览器调用这些方法。。。

@Path("/test")
@Named
public class TestRS extends AbstractRestService {
    /**
     * Logger for this class
     */
    private static final Logger logger = Logger.getLogger(TestRS.class);

    @Inject
    private PeekPoke ejb = null;

    @GET
    @Path("/poke")
    public void poke() {
        if (logger.isDebugEnabled()) {
            logger.debug("poke() - start"); //$NON-NLS-1$
        }

        this.ejb.poke();

        if (logger.isDebugEnabled()) {
            logger.debug("poke() - end"); //$NON-NLS-1$
        }
    }

    @GET
    @Path("/peek")
    public void peek() {
        if (logger.isDebugEnabled()) {
            logger.debug("peek() - start"); //$NON-NLS-1$
        }

        this.ejb.peek();

        if (logger.isDebugEnabled()) {
            logger.debug("peek() - end"); //$NON-NLS-1$
        }
    }
}

我可以打电话给 peek 以及 poke 方法并获取期望值。但是,如果我尝试从一个示例调用poke,从另一个示例中窥视,我会发现这些值没有在ejb中复制。
我的印象是,集群的单例将复制 value '跨两个应用程序服务器,提供相同的值,而不管我使用哪个主机 peek 来自的呼叫。这不对吗?我是否还缺少一些需要添加到此代码中的内容?
我很感激你能给我的任何帮助!谢谢!

uidvcgyl

uidvcgyl1#

单例会话bean提供了一个正式的编程构造,它保证在特定的java虚拟机(jvm)中,每个应用程序将示例化一个会话bean。
jsr 318:EnterpriseJavaBeans tm 3.1版说:
单例会话bean是每个应用程序示例化一次的会话bean组件。在容器分布在许多虚拟机上的情况下,每个应用程序将为每个jvm提供一个单例bean示例
因此,在集群应用程序中,每个集群成员都有自己的单例会话bean示例,并且数据不会在jvm示例之间共享(在wildfly实现中)。
在wildfly中,如果在集群范围内只需要一个singleton示例,那么可以使用 SingletonService 实施。使用 SingletonService ,目标服务安装在群集中的每个节点上,但在任何给定的时间只在一个节点上启动。
请参见:
实现ha单例
集群ha singleton:部署在由singletonstartup启动并由ejb访问的jar中的singletonservice
更新:
wildfly10增加了将给定应用程序部署为“单例部署”的能力。这是as6.0及更早版本中的一个特性的新实现。当部署到一组集群服务器时,单例部署在任何给定的时间都只能部署在单个节点上。如果部署处于活动状态的节点停止或失败,则部署将自动在另一个节点上启动。
请看:wildfly 10决赛现已开始!

相关问题