我们有一个用JavaEE开发的大型应用程序(primefaces,wildfly,Websocket)。我们的应用程序的重要功能背后的想法是,如果两个或更多用户同时在线,那么他们可以看到彼此的状态。
e.g。 如果' Maik'和安德烈'在线,然后Maik可以看到Andre的在线状态,Andre看到了Maik的状态。
我们使用Websocket(服务器端点,客户端的Javascript Websocket API)。
客户端通过安全websocket将其用户ID(UUID)发送到服务器,服务器将它们保存在Hashmap中(密钥:用户当前登录的页面ID,值:user-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);
调用支持bean函数后,RemoteCommand更新组件&#34; OnlineUsersFormId:onlineUserId&#34;在XHTML页面中。页面中的确切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)离开页面但他的名字不在时,它会突然停止工作已从其他用户(安德烈)页面中移除(虽然服务器告诉他删除Maik的名称 - 它也只能工作一段时间)。 我们的直觉就是说有一些东西用于更新组件&#34;在remoteCommand中工作异常。
任何帮助都将不胜感激。
祝你好运, 塔希尔