群集单身人士使用Wildfly?

我正在尝试在Wildfly 8.2上创建一个简单的集群Singleton 。 我已经配置了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,并从另一个实例查看,我发现这些值没有在EJB之间复制。

我的印象是,群集单例会在两个应用程序服务器上复制’ value ‘的值,无论我从哪个主机调用peek ,都会提供相同的值。 这不正确吗? 是否还有一些我需要添加到此代码中的内容?

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

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

JSR 318:Enterprise JavaBeans TM 3.1版说:

Singleton会话bean是一个会话bean组件,每个应用程序实例化一次。 在容器分布在许多虚拟机上的情况下,每个应用程序将为每个JVM配备一个Singleton的bean实例

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

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

看到:

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

更新:

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

请参阅: WildFly 10 Final现已推出!