如何从Source.actorRef()获取ActorRef?

时间:2017-11-02 17:51:56

标签: akka akka-stream

我想对Web应用程序执行一些服务器端事件(SSE)。我想我已经把所有的SSE管道化了。我现在需要在房子的Akka HTTP端创建一个Source。

我发现你可以这样做:

val source = Source.actorRef(5, akka.stream.OverflowStrategy.dropTail)

我想要做的是以某种方式“发布”到这个来源,大概是通过向演员发送消息。我从文档中看到此调用会创建Source<T,ActorRef>

如何获取此ActorRef实例以便向其发送消息?

1 个答案:

答案 0 :(得分:2)

要从ActorRef获取具体化的Source.actorRef,必须运行该流。例如,假设您要将SSE有效负载数据(以String的形式)发送给此actor,该actor将该数据转换为ServerSentEvent个对象以发送给客户端。你可以这样做:

val (actor, sseSource) =
  Source.actorRef[String](5, akka.stream.OverflowStrategy.dropTail)
        .map(s => /* convert String to ServerSideEvent */)
        .keepAlive(1.second, () => ServerSentEvent.heartbeat)
        .toMat(BroadcastHub.sink[ServerSentEvent])(Keep.both)
        .run()

// (ActorRef, Source[ServerSentEvent, NotUsed])

现在您可以向物化参与者发送消息:

actor ! "quesadilla"

在您的路线中使用sseSource

path("events") {
  get {
    complete(sseSource)
  }
}

请注意,此方法没有背压(即,向演员发送的消息被解雇并被遗忘)。