私のアプリでは、次のような機能が必要です: 私が取り組んでいる gwt アプリを使用してログインした特権ユーザーがボタンを押し、要求がサーバーに送信され、サーバーが他のすべてのログイン ユーザーに通知を送信し、そのアプリが何らかの種類のメッセージを表示します。アラート。私が理解できない1つのステップは、ログインしているすべてのユーザーに通知を送信することです-特権ユーザーが通知をトリガーするまでハングする何らかの種類のクライアントサーバー接続を確立する方法と、サーバーがすべてのログインユーザーに関する情報を収集する方法? それに対処する方法について何か提案をいただけますか?
4 に答える
GWT-RPC を使用している場合の 1 つのアプローチは、「ロング コール」です。
クライアントが GWT-RPX 呼び出しを行い、サーバー側は何もせずにそこに座っています。最終的に、特権ユーザーがボタンを押すと、サーバー側がすべての「待機中」のクライアントにシグナルを送信します。長い RPC 呼び出しが返され、何かが実行されます。
これをクラスでラップする必要がある場合があります。長い呼び出しはサーバーの構成によってはタイムアウトになる可能性があるため、サーバー側で x 秒間待機し、クライアントに次のことを伝えるコードを返すループが本当に必要です。トリガーが発生しなかったため、呼び出しを再度行う必要があります。
この機能は、おそらくサードパーティのライブラリによってすでに提供されていますが、しばらく前に手動でロールバックしたところ、動作しました ;-)
サーバー側のメモリから、すべてのクライアント呼び出しがセマフォで待機していました。特権ユーザーのサーバー側呼び出しが正しい番号を解放したことを確認するだけで済みました (待機中のすべてのクライアントが続行するように通知されるように)。同期された変数とループだけで簡単なもの。
クライアント - この疑似コードを考えてみてください。実際にはそれほどよく考えられていません。
// lock needs to be a common var so all threads are working on the same one.
// probably a static?
int counter = 0;
while(counter < 5) {
synchronized(lock) {
if (lock) {
// return "success"
}
counter++;
sleep(1000); // sleep one second
}
}
// return "try again"
lock
すべてのクライアントがreturn success
チャンクにアクセスできるようにするには、サーバーのサイズを true に設定する同期呼び出しが明らかに必要です。また、どこかでロックを false にリセットする必要があります。
クライアント側でタイマーを使用してサーバーに変更をポーリングするのはどうですか。通知をデータベースに保存するだけで、クライアントは数秒ごとに新しい通知をチェックできます。サーバー上で何かをロックする必要はないため、複数のサーバーでも機能します。誰がログに記録されているかを追跡する必要はありません。アクティブなクライアントは新しい通知をポーリングします。クライアントが離れると、ポーリングが停止します。
サーバーがクライアントに接続するには、WebSocketsのようなものを実装する必要があります。
GWT をサポートする 1 つのソケット ライブラリを次に示します。または、この検索でどこにたどり着くかを確認できます。