2

JavaEE (primefaces、wildfly、Websocket) で開発された大規模なアプリケーションがあります。このアプリケーションの重要な機能の背後にある考え方は、2 人以上のユーザーが同時にオンラインになっている場合、お互いのステータスを確認できるということです。

たとえば、'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);

バッキング 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