我们有一个使用 JavaEE(primefaces、wildfly、Websocket)开发的大型应用程序。我们应用程序的重要功能背后的想法是,如果两个或更多用户同时在线,那么他们可以看到彼此的状态。
例如,如果“Maik”和“Andre”在线,那么 Maik 可以看到 Andre 的在线状态,而 Andre 可以看到 Maik 的状态。
我们使用 Websocket(服务器端点,客户端的 Javascript Websocket API)。
客户端通过安全的 websocket 将他们的用户 ID(UUID)发送到服务器,服务器将它们保存在 Hashmap 中(键:用户当前登录的页面 ID,值:用户 ID)。服务器向客户端和客户端返回一个 json 字符串,然后使用参数化的 RemoteCommand 将该字符串发送到支持 bean。
ws.onmessage = function(e) {
console.log("received msg: " + e.data);
showOnlineUsers([ {
name : 'jsonString',
value : e.data
} ]);
}
xhtml 页面中的 RemoteCommand 用作:
<p:remoteCommand name="showOnlineUsers"
action="#{bean.showOnlineUsers()}"
process="@form" update="OnlineUsersFormId:onlineUserId" />
RemoteCommand 调用一个支持 bean 函数 - showOnlineUSers()。
String jsonString = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("jsonString");
// Logic to extract jsonSting and generate a List of users.
// Set the users list for XHTML component.
setUsersList(list);
调用 backing bean 函数后,RemoteCommand 更新 XHTML 页面中的组件“OnlineUsersFormId:onlineUserId”。页面中的确切 jsf 组件如下:-
<h:form id="OnlineUsersFormId">
<h:panelGroup id="onlineUserId">
<ui:repeat var="user" value="#{bean.getUsersList()}">
#{user.getUserName()}
</ui:repeat>
</h:panelGroup>
</h:form>
问题: 逻辑工作正常,但工作一段时间后,当用户(Maik)离开页面但他的名字没有从其他用户(Andre)页面中删除时突然停止工作(尽管服务器告诉他删除 Maik 的名字 - 它也只能在一段时间内正常工作)。我们的直觉表明,remoteCommand 中的“更新组件”工作异常。
任何帮助,将不胜感激。
最好的问候, 塔希尔