0

我有一个集群作为带有 Hazelcast 和 Payara 的独立实例,我添加了一个会话复制和一个带有 HAProxy 的负载均衡器。一切正常。

当我使用 Session Bean 时,所有全局变量都被复制到集群的节点,但是当我尝试在 no-SessionBean 中共享一个对象几次时它不起作用。下面是我的简单示例:

我有一个简单的页面,可以检索 2 个“字符串”列表(Hazelcast 分布式列表和会话列表):

索引页

页面后面的 Bean 有一个自定义范围。

@Named
@RomeoScoped  //this is my custom scope
public class RomeoBean implements Serializable {

当我单击“添加”按钮时,会调用“增加”方法:

public void increase(){
    FacesContext currentInstance = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest) currentInstance.getExternalContext().getRequest();
    HttpSession session = request.getSession();

    String example  = Math.random() + "";

    if(session != null){
       CopyOnWriteArrayList<String> list = (CopyOnWriteArrayList<String>) session.getAttribute("List");
       list.add(example);
       session.setAttribute("List", list);
    }

    try {
       Context ctx = new InitialContext();
       HazelcastInstance instance = (HazelcastInstance)    ctx.lookup("payara/Hazelcast");
       IList<String> list = instance.getList("list");
       list.add(example);
    } catch (NamingException ex) {
       Logger.getLogger(RomeoBean.class.getName()).log(Level.SEVERE, null, ex);
    }
}

在按钮上单击 4 次后,situazione 是这样的:

点击查看示例

会话列表中仅共享 2 个字符串,而所有字符串都与 Hazelcast 共享。我需要使用我的自定义范围,在同样的情况下,对象只能在会话中共享,而不是在应用程序中共享(作为 Hazelcast 分布式列表)。

我可以用“setAttribute”方法解决问题吗?

提前感谢您的支持。

4

1 回答 1

1

为了使会话复制在 Payara Server 中的 Hazelcast 上工作,您需要在 Hazelcast 上启用 Web 容器可用性。请参阅此屏幕截图

您还需要将<distributable/>元素包含web.xml在应用程序中,否则会话将不会被分发。

于 2016-12-13T20:23:19.193 回答