我正在尝试创建一个简单的 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
来自的呼叫。这不对吗?我是否还缺少一些需要添加到此代码中的内容?
我很感激你能给我的任何帮助!谢谢!
1条答案
按热度按时间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决赛现已开始!