§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`を使用してソースを作成する方が簡単な場合があります。
このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスがあれば、コミュニティフォーラムに移動して、コミュニティとの会話を開始してください。