Comet
Comet是指基于 HTTP 长连接的“服务器推”技术,是一种不需要客户端主动请求,服务端可以主动让客户端推送消息的技术。
英文原文
https://playframework.com/documentation/2.6.x/JavaComet#using-chunked-responses-with-comet
使用chunked response来实现Comet
chunked responses最主要的作用是创建Comet sockets。
一个Comet socket 只包含<script>
元素的是chunkedtest/html
响应。对于每一个chunk,我们写入一个包含JS的
Comet引用
import akka.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
使用String Flow
public static Result index() {
final Source source = Source.from(Arrays.asList("kiki", "foo", "bar"));
return ok().chunked(source.via(Comet.string("parent.cometMessage"))).as(Http.MimeTypes.HTML);
}
使用Json Flow
public static Result index() {
final ObjectNode objectNode = Json.newObject();
objectNode.put("foo", "bar");
final Source source = Source.from(Collections.singletonList(objectNode));
return ok().chunked(source.via(Comet.json("parent.cometMessage"))).as(Http.MimeTypes.HTML);
}
使用iframe
Comet helper需要特别使用一种名为forever-iframe
的技术,如下html页面所示:
<script type="text/javascript">
var cometMessage = function(event) {
console.log('Received event: ' + event)
}
</script>
<iframe src="/comet"></iframe>
Note: 将如下配置添加到你的application.conf中,也要确保在routes中配置了正确的路由能够找到上面的action |
play.filters.headers {
frameOptions = "SAMEORIGIN"
contentSecurityPolicy = "connect-src 'self'"
}
可以通过一个一个时钟的模版来学习一下Comet helper
Dubug Comet
最简单的方式是使用log()
操作来展示将数据映射到流中所出现的所有操作。
遗留的Comet Functionality
之前通过play.libs.Comet遗留的Comet Functionality仍然可以使用,但是已经被放弃不再推荐使用。
由于Java Comet helper是基于回调机制的, 直接在org.reactivestreams.Publisher使用回调 然后通过Source.fromPublisher 来创建一个source或许是一个更简单的方法