Atmosphere (1.0.12) を使用してプロトタイプを作成したいのですが、現在の実装ではフォールバック トランスポートが機能しません。
単純なシナリオ:
1. クライアントがサーバーに接続 - サーバーは現在の (完全な) 状態をそのクライアントに
プッシュします 2. サーバーは現在の状態の変更を接続されているすべてのクライアントにプッシュします
これは非常に一般的なシナリオだと思います。
どのように私はウェブソケットのためにそれをしました:
クライアントが接続 (GET) すると、デフォルトのブロードキャスターにリソースを追加します。このブロードキャスターは、すべてのクライアントにデータ (変更) を送信するために使用されます。同じメソッドで、このリソース用に別の
ブロードキャスターを作成します。クライアントはデータをサーバーにプッシュします。POST メソッドが呼び出されます。つまり、私はクライアントであり、現在の完全な状態が必要です。したがって、サーバーは元のリソース UUID を取得し、privateBroadcaster を見つけ、privateBroadcaster を使用して完全な状態をそのクライアントにプッシュします。
- サーバーは、デフォルトの boradcaster を使用してすべてのクライアントにデータをプッシュします。privateBroacaster は、クライアントが完全な状態を再度要求しない限り使用されません。
問題:
ブラウザーが WebSocket (IE9、IE 8 など) をサポートしていない場合、このソリューションはフォールバック トランスポートでは機能しません。メソッド POST の元のリソースが現在のリソースと同じであるため、このソリューションは機能しません。そのため、プライベート ブロードキャスターを取得して完全な状態をクライアントに送信することはできません。
質問:
- 私のソリューションは、いくつかの変更で機能する可能性がありますか? もしそうなら、私は何を変えるべきですか?
そうでない場合 - このシナリオの解決策を作成するには?
私は現在道に迷っており、助けが必要であることを認めます。詳細が必要な場合は、お尋ねください。前もって感謝します。
--update プライベート ブロードキャスタ
の作成を担当するコードの一部を POST メソッドに移動することにしました。この方法を以下に示します。応答を作成する責任がある部分は関係がないため、隠されています。これは Webscokets では問題なく機能しますが、フォールバック (ロングポーリング) プロトコルでは機能しません。初期状態はクライアントによって受信されず、変更は受信されますが、更新するものはありません。
@Context AtmosphereResource resource;
@Context BroadcasterFactory broadcasterFactory;
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public void sendCurrentState(Request request){
logger.info("creating private broadcaster for uuid: " + resource.uuid());
Broadcaster privateBroadcaster = broadcasterFactory.lookup(DefaultBroadcaster.class, resource.uuid(), true);
privateBroadcaster.addAtmosphereResource(resource);
//Prepare response (hidden)
privateBroadcaster.broadcast(encodedJSON);
}
ヒューバート