Что означают параметры типа для Source<Out, Mat>?

Я пытаюсь понять тип источника для потоков Akka, указанный здесь.

К сожалению, документация и примеры, которые я нашел, не объясняют, что на самом деле означает каждый из параметров типа. Я предполагаю, что Out это тип, который источник излучает при материализации. Это верно? Какой параметр другого типа Mat?

1 ответ

Решение

Из

Вы правы, это тип элементов, которые испускаются Source,

Мат

Это тип Sourceматериализация. Обратите внимание, что каждый этап (Flows, Sinks, и т. д.) материализуются и в значение. По сути, это побочный продукт самой сцены после ее запуска.

Вы можете представить это как средство взаимодействия со сценой во время ее работы. Глядя на примеры готовых SourceАкка - это хороший способ понять суть.

  • Source.single материализуется в NotUsed, У вас нет возможности взаимодействовать с источником, поскольку он сразу создаст только один элемент, а затем завершит его.

  • Source.queue материализуется до SourceQueue, Это более интересный случай, так как вы можете взаимодействовать с источником offerв сообщениях к нему. Сообщения, которые вы offer будет выпущен источником.

  • Source.maybe материализуется до Promise, Вы можете использовать Promise контролировать источник и заставить его излучать один элемент, или None,

При объединении различных этапов обратите внимание, что каждый этап может иметь полезную материализованную ценность. Вы можете выбрать, какие из них оставить, используя viaMat/toMat а также Keep DSL. Одно или несколько материализованных значений будут возвращены, когда run() вызывается на составном графе.

Взгляните на типы в примерах ниже, это лучший способ понять суть API:

  val source: Source[Int, MatSrc]
  val sink: Sink[Int, MatSnk]

  val matSrc: MatSrc = source.toMat(sink)(Keep.left).run()
  val matSnk: MatSnk = source.toMat(sink)(Keep.right).run()
  val (m1: MatSrc, m2: MatSnk) = source.toMat(sink)(Keep.both).run()
  val n: NotUsed = source.toMat(sink)(Keep.none).run()

Обратите внимание, что более краткий DSL, который вы можете найти во многих примерах, на самом деле является ярлыком для вышеупомянутого, где сохраняется только материализованное значение последней ступени (например, приемника).

  val mat3: Mat3 = source.viaMat(flow)(Keep.right).toMat(sink)(Keep.right).run()

такой же как

  val mat3: Mat3 = source.via(flow).runWith(sink)

См. Документы ниже для дальнейшего чтения.

http://doc.akka.io/docs/akka/2.4/java/stream/stream-quickstart.html

Другие вопросы по тегам