我有一个群集作为Hazelcast和Payara的独立实例,我添加了会话复制和带有HAProxy的负载均衡器。一切正常。
当我使用会话Bean时,所有全局变量都会复制到集群的节点,但是当我尝试在非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次后,这个位置就是:
会话列表中只共享2个字符串,而所有字符串都使用Hazelcast。 我需要使用我的自定义范围,在相同的情况下,对象必须仅在会话中共享,而不是在应用程序中共享(如Hazelcast分布式列表)。
我可以使用“setAttribute”方法解决问题吗?
提前感谢您的支持。
答案 0 :(得分:1)
为了使会话复制在Payara Server中通过Hazelcast工作,您需要通过Hazelcast启用Web容器可用性。请参阅此screenshot。
您还需要将<distributable/>
元素包含在应用程序的web.xml
中,否则将不会分发会话。