EAP 7:在集群模式下,状态状态会话Bean之间未复制EJB状态

时间:2019-02-09 22:27:43

标签: infinispan jboss-eap-7 stateful-session-bean ejb-3.2

我已经运行了两个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

我有一个有状态的会话bean:

import javax.ejb.Stateful;

@Stateful
public class Counter {

    int counter;

    public int getCounter() {
        ++counter;
        return counter;
    }
}

JSF应用程序范围内的bean:

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();
    }
}

JSF会话范围的bean:

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>

现在,当我在localhost:8080 / index.xhtml上导航到node1时,我有一个webppage,其中有两个以1开头的计数器。每次刷新页面时,它都会计数。

当我在localhost:8084 / index.xhtml上导航到node2时,我希望看到来自node1的最后两个增量值,但是来自@Stateful bean的计数器不会增加来自node1的值。

示例: 导航到node1:

1
1

->刷新node1

2
2

->刷新node1

3
3

导航到节点2:

1
4

->刷新node2

2
5

再次刷新节点1:

4
6

再次刷新节点2:

3
8

这两个页​​面独立工作,但是有状态会话Bean之间的状态应该被复制。我不明白为什么它不起作用。 @SessionScoped bean之间的状态始终被复制...

我在寻找一些文档,发现了这一点

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,如果使用HA配置文件启动JBoss EAP,则   您的SFSB的状态将被复制。

@Stateful bean是否需要更多配置?

1 个答案:

答案 0 :(得分:0)

上述代码的问题在于,即使复制了状态本身,@ ApplicationScoped SFSB引用也不在node1和node2之间共享。