【问题标题】:How to Use WebSocket.acceptWithActor with BroadCast in Playframework2.3.7如何在 Playframework2.3.7 中使用 WebSocket.acceptWithActor 和广播
【发布时间】:2015-01-25 14:35:34
【问题描述】:

如何在 Playframework2.3.7 中使用 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!")
    }

  }
}

【问题讨论】:

    标签: playframework websocket playframework-2.3


    【解决方案1】:

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

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

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

    唯一棘手的部分是从事件总线中取消订阅actor,这可以在UntypedActor 的postStop() 方法中完成。

    【讨论】:

    • 感谢您的回答。我会试试这个!
    • 没问题。我将扩展的实现留给您,但是如果您有任何问题,请告诉我。
    • 能否请您扩展一下。我不知道 eventBus 对象。我希望这个 scala 版本。
    • 它是来自 akka-actor 2.11 的抽象类 LookupEventBus。
    猜你喜欢
    • 2013-12-21
    • 2013-07-14
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2016-04-28
    • 2010-10-10
    • 1970-01-01
    • 2019-06-01
    相关资源
    最近更新 更多