ドキュメント

§Comet

§Cometでチャンクレスポンスを使用する

チャンクレスポンスの一般的な用途は、Cometソケットを作成することです。

Cometソケットとは、<script>要素のみを含むチャンク化されたtext/htmlレスポンスです。チャンクごとに、Webブラウザですぐに実行されるJavaScriptを含む<script>タグを記述します。このようにして、サーバーからWebブラウザにイベントをライブで送信できます。メッセージごとに、JavaScriptコールバック関数を呼び出す<script>タグにラップして、チャンクレスポンスに書き込みます。

ok().chunkedは、Akka Streamsを活用してFlow<ByteString>を取得するため、要素のFlowを送信し、各要素がエスケープされてJavascriptメソッドにラップされるように変換できます。CometヘルパーはCometソケットを自動化し、ブラウザの互換性のために初期の空白バッファデータをプッシュし、文字列メッセージとJSONメッセージの両方をサポートします。

§Cometのインポート

Cometヘルパーを使用するには、次のクラスをインポートします。

import org.apache.pekko.NotUsed;
import org.apache.pekko.stream.javadsl.Source;
import play.core.j.JavaHandlerComponents;
import play.libs.Comet;
import play.libs.Json;
import play.mvc.Http;
import play.mvc.Result;

また、マテリアライザーも必要になります。これは、DIシステムからakka.stream.Materializerを取得するのが最適です。

§文字列FlowでCometを使用する

Flowを介して文字列メッセージをプッシュするには、次のようにします。

public static Result index() {
  final Source<String, NotUsed> source = Source.from(Arrays.asList("kiki", "foo", "bar"));
  return ok().chunked(source.via(Comet.string("parent.cometMessage"))).as(Http.MimeTypes.HTML);
}

§JSON FlowでCometを使用する

Flowを介してJSONメッセージをプッシュするには、次のようにします。

public static Result index() {
  final ObjectNode objectNode = Json.newObject();
  objectNode.put("foo", "bar");
  final Source<JsonNode, NotUsed> source = Source.from(Collections.singletonList(objectNode));
  return ok().chunked(source.via(Comet.json("parent.cometMessage"))).as(Http.MimeTypes.HTML);
}

§iframeでCometを使用する

Cometヘルパーは通常、次のようなHTMLページでforever-iframe手法で使用されます。

<script type="text/javascript">
  var cometMessage = function(event) {
    console.log('Received event: ' + event)
  }
</script>

<iframe src="/comet"></iframe>

:application.confに次の設定を追加し、上記のCometが動作することを確認するためにルートマッピングが設定されていることを確認してください。

play.filters.headers {
  frameOptions = "SAMEORIGIN"
  contentSecurityPolicy = "connect-src 'self'"
}

Cometヘルパーの例については、Play Streaming Exampleを参照してください。

§Cometのデバッグ

機能していないCometストリームをデバッグする最も簡単な方法は、log()操作を使用して、ストリームを介したデータのマッピングに関連するエラーを表示することです。

§レガシーComet機能

既存のComet機能は、play.libs.Cometから引き続き利用できますが、非推奨となっているため、Akka Streamsベースのバージョンに移行することをお勧めします。

Java Cometヘルパーはコールバックに基づいているため、コールバックベースの機能を直接org.reactivestreams.Publisherに変換し、`Source.fromPublisher`を使用してソースを作成する方が簡単な場合があります。

次:WebSockets


このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスがあれば、コミュニティフォーラムに移動して、コミュニティとの会話を開始してください。