如何在Playframework2.3.7中使用带有BroadCast的WebSocket.acceptWithActor

时间:2015-01-25 14:35:35

标签: playframework websocket playframework-2.3

如何在Playframework2.3.7中使用带有BroadCast的WebSocket.acceptWithActor

我不想在广播中写Iteratee。 https://www.playframework.com/documentation/2.3.x/ScalaWebSockets

我想在接收来自客户端的消息时推送所有客户端。

@Singleton
class Application @Inject() (textGenerator:TextGenerator) extends Controller {

  def index = Action {
    Ok(views.html.index(textGenerator.welcomeText))


  }
  def socket = WebSocket.acceptWithActor[String, String] { request => out =>
    MyWebSocketActor.props(out)
  }

  object MyWebSocketActor {
    def props(out: ActorRef) = Props(new MyWebSocketActor(out))
  }

  class MyWebSocketActor(out: ActorRef) extends Actor {
    private[this] var (channel) = Concurrent.broadcast[String]
    override def receive = {
      case msg: String =>
        out ! msg
    }
    override def postStop() = {
      Logger.info("Disconnected!")
    }

  }
}

1 个答案:

答案 0 :(得分:1)

我强烈建议您使用LookupEventBus框架中的akka。您可以将演员订阅到特定频道,让事件总线为您完成广播工作。订阅名为sample的频道:

WebSocket.withActor((out) -> {
    eventBus.subscribe(out, "sample");
    return Props.create(SampleActor.class, out, eventBus);
});

eventBus - LookupEventBus的扩展名。 SampleActor - UntypedActor的扩展名。

唯一棘手的部分是取消订阅活动总线的演员,可以使用postStop()的{​​{1}}方法完成。