Play 2.6 Comet

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或许是一个更简单的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值