当前位置: 首页 > 面试题库 >

使用Wildfly的集群式Singleton?

罗梓
2023-03-14
问题内容

我正在尝试Singleton在Wildfly
8.2上创建一个简单的集群。我已经配置了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$
        }
    }
}

我可以从单个Wildfly实例中调用peekpoke方法,并获得预期值。但是,如果我尝试从一个实例调用poke,然后从另一个实例调用peek,我会看到这些值没有跨EJB复制。

我的印象是,群集的单例将value在两个应用程序服务器之间复制“
”的值,无论我peek从哪个主机进行调用,都提供相同的值。这不正确吗?我缺少什么仍然需要添加到此代码中的东西吗?

我会很感激您能给我的任何帮助!谢谢!


问题答案:

单例会话Bean提供了一种正式的编程结构,该结构可确保会话Bean将在特定 Java虚拟机(JVM)中的 每个应用程序 实例化一次。

JSR 318:企业JavaBeans TM,3.1版 说:

Singleton会话Bean是一个会话Bean组件,每个应用程序实例化一次。如果容器分布在许多虚拟机上,则每个应用程序将为每个JVM具有一个Singleton的bean实例。

因此,在集群应用程序中,每个集群成员将拥有自己的单例会话bean实例,并且数据不会在JVM实例之间共享(在Wildfly实现中)。

在Wildfly中,如果在集群范围内只需要一个单例实例,则可以使用SingletonService 实现。使用a
SingletonService,目标服务安装在群集中的每个节点上,但在任何给定时间仅在一个节点上启动。

看到:

  • 实施HA Singleton
  • cluster-ha-singleton:SingletonService部署在由SingletonStartup启动并由EJB访问的JAR中

更新:

WildFly 10增加了将给定应用程序部署为 “单个部署”的功能 。这是AS
6.0和更早版本中存在的功能的新实现。当部署到一组集群服务器时,单例部署将仅在任何给定时间部署在单个节点上。如果活动部署的节点停止或失败,则部署将自动在另一个节点上启动。

请参阅:WildFly 10
Final现在可用!



 类似资料:
  • 以前的2台JBoss 6服务器(主 主实例使用port-offset = "220 "在以下配置下运行(仅发布片段): 我尝试使用Undertow来处理JMS的连接和HornetQ,配置如下: 我对远程处理也做了同样的事情。 这允许我启动主实例并部署应用程序。该实例监听端口4667 (4447端口偏移量220)。 但是,在从属实例上部署应用程序会失败,因为它似乎无法连接到主实例。失败只发生在Wil

  • 我正在使用Node.js、Express和pm2构建一个用于流程管理的无状态Web应用程序。在生产环境中,我为服务器CPU的每个核心运行一个应用程序实例(感谢pm2集群模式)。 最近我开始阅读Greenlock-Express(用于自动获取证书),它还有一个“cluster”属性,如果我理解正确的话,它基本上与pm2集群模式做的事情相同。 如果我在集群模式下同时运行Greenlock-Expres

  • 我是Docker Swarm的新手。我试图用compose文件在Docker swarm上部署redis集群。我希望redis集群使用端口6380,所以我配置了端口,并让它在compose文件中挂载redis配置文件。 但是当我运行时,我得到了一个错误的声明,“对不起,集群配置文件redis-node.conf已经被不同的Redis集群节点使用了。请确保不同的节点使用不同的集群配置文件。” 这是我

  • 根据这份文件: 然而,与Redis(群集模式禁用)群集不同,当前,一旦创建了Redis(群集模式启用)群集,其结构就不能以任何方式改变;不能添加或删除节点或碎片。如果需要添加或删除节点,或更改节点类型,则必须重新创建集群。(来源) 然而,本文档似乎描述了向集群添加碎片的过程: 通过使用Amazon ElastiCache for Redis 3.2.10版本的在线重新划分和分片重新平衡,您可以动态

  • 集群策略插件化 分布式集群策略采用插件的方式实现,通过SPI的形式发布,通过配置文件激活。 zookeeper分布式策略

  • 我将使用嵌入在 JBoss EAP 6.2 中的 HornetQ 2.3.12,并且需要一些集群队列。 我是否需要设置 JBoss 集群才能让 JMS 集群由大黄蜂 Q 提供支持,或者大黄蜂 Q 是独立的?根据文档,我认为是后者,因为大黄蜂Q集群是大黄蜂Q的一部分,可以在没有JBoss的情况下存在。 节点通过核心网桥连接,因此部署在每个节点中的应用程序将对队列名称执行本地 JNDI 查找,而无需集