Что означают параметры типа для Source<Out, Mat>?
Я пытаюсь понять тип источника для потоков Akka, указанный здесь.
К сожалению, документация и примеры, которые я нашел, не объясняют, что на самом деле означает каждый из параметров типа. Я предполагаю, что Out
это тип, который источник излучает при материализации. Это верно? Какой параметр другого типа Mat
?
1 ответ
Из
Вы правы, это тип элементов, которые испускаются Source
,
Мат
Это тип Source
материализация. Обратите внимание, что каждый этап (Flow
s, Sink
s, и т. д.) материализуются и в значение. По сути, это побочный продукт самой сцены после ее запуска.
Вы можете представить это как средство взаимодействия со сценой во время ее работы. Глядя на примеры готовых 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