【发布时间】:2015-03-13 05:12:10
【问题描述】:
我正在尝试在 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 调用,都提供相同的值。这不正确吗?有什么我遗漏的东西仍然需要添加到此代码中吗?
如果您能给我任何帮助,我将不胜感激!谢谢!
【问题讨论】:
标签: java singleton ejb cluster-computing wildfly