如何在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!")
}
}
}
答案 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}}方法完成。