2

我们有一个使用 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 中的“更新组件”工作异常。

任何帮助,将不胜感激。

最好的问候, 塔希尔

4

0 回答 0