Akka-streams — как получить доступ к материализованному значению потока

Я учусь работать с потоками Akka, и мне это очень нравится, но часть материализации все еще остается для меня загадкой.

Цитата из http://doc.akka.io/docs/akka-stream-and-http-experimental/snapshot/scala/http/client-side/host-level.html#host-level-api

... инициировать немедленное отключение определенного пула, вызвав shutdown() для экземпляра HostConnectionPool, в котором материализуется поток клиента пула

Как мне получить экземпляр HostConnectionPool?

Что еще более важно, я хотел бы в целом понять, как получить доступ к материализованному значению и выполнить какую-либо операцию или извлечь из него информацию.

Заранее спасибо за любые указатели документации или объяснения.


person Yardena    schedule 21.01.2016    source источник
comment
Это может быть решением вашего вопроса: stackoverflow.com/a/36467193/1274237 Это основано на обсуждении здесь: github.com/akka/akka/issues/17769#issuecomment-206532674   -  person ncreep    schedule 27.11.2016


Ответы (1)


Это достигается с помощью Source.viaMat. Расширение примера кода с ссылка, указанная в вашем вопросе:

import akka.http.scaladsl.Http.HostConnectionPool
import akka.stream.scaladsl.Keep
import akka.stream.scaladsl.RunnableGraph

val poolClientFlow = Http().cachedHostConnectionPool[Int]("akka.io")

val graph: RunnableGraph[(HostConnectionPool, Future[(Try[HttpResponse], Int)])]  =
  Source.single(HttpRequest(uri = "/") -> 42)
        .viaMat(poolClientFlow)(Keep.right)
        .toMat(Sink.head)(Keep.both)

val (pool, fut) = graph.run()

pool.shutdown()

Поскольку Source.single материализуется в Unit, Keep.right говорит сохранить HostConnectionPool, в который материализуется poolClientFlow. В функции .toMat Keep.both говорит о том, что левый пул должен оставаться в потоке, а правый Future — в Sink.

person Ramón J Romero y Vigil    schedule 22.01.2016
comment
Большое спасибо за ответ, toMat()(Keep.both) определенно полезен. Однако что, если я хочу получить доступ к пулу не в том месте кода, где я запускаю поток? Имеет ли смысл делать что-то вроде: Source.empty.viaMat(poolClientFlow)(Keep.right).to(Sink.ignore).run() только для того, чтобы получить доступ к пулу? Я предполагаю, что в общем случае каждый поток может быть материализован в другой экземпляр, но здесь это один и тот же общий пул... - person Yardena; 24.01.2016
comment
@Ярдена Добро пожаловать. Я никогда не пытался получить доступ к материализованному пулу вне контекста потока. Для этого вы можете просто вызвать конструктор HostConnectionPool с теми же настройками, что и настройки Http.newHostConnectionPool. Это должно возвращать тот же экземпляр, но я бы не хотел указывать это в своем ответе, поскольку я никогда раньше этого не пробовал. Удачного взлома. - person Ramón J Romero y Vigil; 24.01.2016
comment
Еще раз спасибо, я думаю, что буду придерживаться Http().shutdownAllConnectionPools() - person Yardena; 25.01.2016