Как я могу получить ActorRef из Source.actorRef ()?

Я хочу сделать некоторые серверные события (SSE) для веб-приложения. Я думаю, что у меня все SSE налажено и работает. Теперь мне нужно создать источник на HTTP-стороне Akka.

Я обнаружил, что вы можете сделать что-то вроде этого:

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

Я хочу каким-то образом "опубликовать" этот источник, предположительно, отправив сообщение актеру. Из документации я вижу, что этот вызов создает Source<T,ActorRef>.

Как мне получить этот экземпляр ActorRef, чтобы я мог отправлять ему сообщения?


person Greg    schedule 02.11.2017    source источник
comment
Вы использовали developer.lightbend.com/docs/alpakka/current/sse.html? или вы сами пишете эту инфраструктуру?   -  person Arnout Engelen    schedule 06.11.2017
comment
Пишу себя для этого примера. Спасибо за ссылку! Если мое упражнение пройдет хорошо, то взрослая версия может нуждаться в чем-то вроде этого.   -  person Greg    schedule 06.11.2017
comment
Возможный дубликат Доступ к базовому ActorRef источника потока akka, созданного Source.actorRef   -  person Ramón J Romero y Vigil    schedule 08.01.2019


Ответы (1)


Чтобы получить материализованный ActorRef из Source.actorRef, поток должен быть запущен. Например, предположим, что вы хотите отправить данные полезной нагрузки SSE (в форме String) этому субъекту, который преобразует эти данные в _ 4_ объектов для отправки клиенту. Вы можете сделать что-то вроде:

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)
  }
}

Обратите внимание, что этот подход не вызывает противодействия (т. Е. Сообщения актеру отправляются и забываются).

person Jeffrey Chung    schedule 02.11.2017