【发布时间】:2012-03-08 12:34:34
【问题描述】:
我有一个在 p:DataTable.... 中显示一些数据的应用程序。许多用户都可以访问这个表。当一个用户修改表中的记录(创建、编辑、删除)时,此操作会通知给@ApplicationScoped ManagedBean,后者会通知所有其他会话(由其他用户打开)表中的项目已更改,然后它必须从数据库重新加载。 如您所见,这是通知所有会话项目已更改的控制器,
/**
* @author Simone Rondelli
*/
@ManagedBean(name="singleton")
@ApplicationScoped
public class SingletonBean {
private int count;
private HashMap<Class, List<AbstractController>> sessions;
public SingletonBean() {
sessions = new HashMap<Class, List<AbstractController>>();
}
public void addSession(AbstractController session, Class c) {
List<AbstractController> sessionList = sessions.get(c);
if(sessionList == null)
sessionList = new ArrayList<AbstractController>();
sessionList.add(session);
sessions.put(c, sessionList);
}
public void notifyItemsChanged(Class type) {
for(AbstractController a : sessions.get(type)) {
a.prepareList();
a.addWarningMessage("Attenzione i record sono stati modificati!!");
}
}
}
这是 AbstractController 中“尝试”显示消息的代码
public void addWarningMessage(String msg) {
//JsfUtil.addWarningMessage(msg);
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_WARN, msg, msg);
FacesContext.getCurrentInstance().addMessage(null, facesMsg);
}
如果您按 f5,在任何其他页面中,都会显示新记录...但我希望将消息发送到所有其他会话...现在使用我的代码,消息显示在修改所在的页面中完成,与打开的会话数一样多...因此,如果我有 3 个会话与 3 个用户,其中一个在表中进行了一些更改,他将在他的页面中看到 3 条消息,而其他用户看不到任何东西。
- 如何向所有会话发送消息??
【问题讨论】:
-
为什么不使用请求/视图范围的 bean 来保存数据并将缓存作业委托给持久层(JPA 等)?