我正在尝试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实例中调用peek
和poke
方法,并获得预期值。但是,如果我尝试从一个实例调用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
,目标服务安装在群集中的每个节点上,但在任何给定时间仅在一个节点上启动。
看到:
更新:
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 查找,而无需集