Что означают параметры типа Source‹Out,Mat›?

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

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


person Erix    schedule 13.12.2016    source источник


Ответы (1)


Вышел

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

Мат

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

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

  • 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#Materialized_values

person Stefano Bonetti    schedule 13.12.2016