群集单身人士使用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实例中调用peek
和poke
方法并获得预期值。 但是,如果我试图从一个实例调用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现已推出!