У меня запущено два экземпляра EAP 7.0, оба с standalone-full-ha.xml
Один запускается с:
/opt/jboss-eap-7.0/bin/standalone.sh -Djboss.node.name=node1 -Djboss.server.base.dir=/opt/node1 -Djboss.messaging.cluster.password=message -c standalone-full-ha.xml
Другой с:
/opt/jboss-eap-7.0/bin/standalone.sh -Djboss.node.name=node2 -Djboss.server.base.dir=/opt/node2 -Djboss.messaging.cluster.password=message -c standalone-full-ha.xml -Djboss.socket.binding.port-offset=4
Обе программы начинаются с успеха, и я вижу, что они присоединяются к каналу кластера:
[org.infinispan.remoting.transport.jgroups.JGroupsTransport] (MSC service thread 1-6) ISPN000078: Starting JGroups channel ejb
...
[org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 72) WFLYCLINF0002: Started eap.war cache from ejb container
У меня есть сессионный компонент с состоянием:
import javax.ejb.Stateful;
@Stateful
public class Counter {
int counter;
public int getCounter() {
++counter;
return counter;
}
}
Объект JSF:1015 *
import java.io.Serializable;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
@ApplicationScoped
@Named
public class IndexBean implements Serializable {
@Inject
transient Counter counter;
public int getCounter() {
return counter.getCounter();
}
}
EJB-компонент JSF:
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@SessionScoped
@Named
public class SessionBean implements Serializable {
int counter;
public int getCounter() {
++counter;
return counter;
}
}
Web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" metadata-complete="false" version="3.1">
<distributable/>
</web-app>
И index.xhtml:
<html
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>EAP 7</title>
</h:head>
<h:body>
<h:outputText value="#{indexBean.counter}"></h:outputText>
<br />
<br />
<h:outputText value="#{sessionBean.counter}"></h:outputText>
</h:body>
</html>
Теперь, когда я перехожу на узел 1 на локальном хосте: 8080 / index.xhtml, у меня есть веб-страница с двумя счетчиками, начинающимися с 1. И каждый раз, когда я обновляю страницу, она считает.8084 / index.xhtml Я ожидаю увидеть оба последних приращенных значения из узла 1, но счетчик, поступающий из компонента @Stateful, не увеличивает значение из узла 1.
Пример: перейти к узлу1:
1
1
-> обновить узел1
2
2
-> обновить узел1
3
3
перейти к узлу2:
1
4
-> обновить узел2
2
5
обновить снова узел 1:
4
6
обновить снова узел 2:
3
8
две страницы работают независимо, однако состояние между компонентными сессионными компонентами должно быть реплицировано.Я не понимаю, почему это не работает.Состояние между компонентами @SessionScoped всегда повторяется ...
Я искал какую-то документацию и нашел это:
https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.0/html/developing_ejb_applications/clustered_enterprise_javabeans#cluster_topology_communication
Здесь указано в концераздела 8.2:
При запуске JBoss EAP 7, если JBoss EAP запускается с использованием профиля HA, состояние ваших SFSB будет реплицировано.
Есть ли дополнительные настройкинужно для @Stateful bean?