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 で「コンポーネントを更新する」と何かが異常に動作します。
どんな助けでも大歓迎です。
よろしく、タヒル