Play Framework持久化WebSocket连接实现及优化方案咨询
Play Framework WebSocket 持久化连接相关问题与实现
当前Play Framework暂无原生方式实现WebSocket持久化连接,官方文档提及了WebSocket连接保活的相关内容。我编写了如下ProvisioningActor代码,通过向客户端发送心跳消息尝试维持持久化连接:
class ProvisioningActor(sink: ActorRef) extends Actor { private[this] val source = Observable.interval(appConfig.pingInterval).map(elem => elem.toInt) private[this] val ping = Consumer.foreach[Int](x => self ! x) private[this] val task = source.consumeWith(ping).runToFuture override def receive: Receive = { case jsValue: JsValue => logger.debug(s"Received OCPPCallRequest: \n ${Json.prettyPrint(jsValue)}") jsValue.validate[OCPPCallRequest].asEither match { case Right(ocppCall) => handleOCPPCallRequest(ocppCall).materialize.map { case Failure(fail) => sink ! JsError(s"${fail.getMessage}") case Success(succ) => sink ! Json.toJson(succ) } case Left(errors) => logger.error(s"Errors occurred when validating OCPPCallRequest: \n $errors") sink ! Json.toJson(s"error -> ${errors.head._2}") // TODO: Work on this issue here on how we want to propagate errors } case x: Int => logger.debug(s"Elem: $x") handleHeartBeatRequest(2, "HeartbeatRequest").materialize.map { case Failure(fail) => sink ! JsError(s"${fail.getMessage}") case Success(succ) => sink ! Json.toJson(succ) } case msg: Any => logger.warn(s"Received unknown message ${msg.getClass.getTypeName} that cannot be handled, " + s"eagerly closing websocket connection") task.cancel() self ! PoisonPill } }
问题
- 该心跳维持连接的实现是否足够可靠?
- 默认所有WebSocket连接均为持久化不符合需求,是否需基于单连接配置持久化?
- 是否有其他推荐的实现方案?
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

