EAP 7: состояние EJB не реплицируется между сессионными компонентами с состоянием в режиме кластера - PullRequest
0 голосов
/ 10 февраля 2019

У меня запущено два экземпляра 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?

1 Ответ

0 голосов
/ 14 февраля 2019

Проблема с вашим кодом выше заключается в том, что ссылка @ApplicationScoped SFSB не используется совместно узлом 1 и узлом 2, даже если само состояние реплицируется.

...