Akka Streams:Mat代表什么来源[out,Mat]

时间:2016-09-27 14:45:35

标签: akka akka-stream reactive-streams

在Akka流中,源[Out,Mat]或Sink [In,Mat]中的Mat代表什么。什么时候才能使用?

1 个答案:

答案 0 :(得分:25)

Mat type参数表示此流的具体化值的类型。

请记住,在Akka中SourceFlowSink(嗯,所有图表)都只是蓝图 - 它们本身不进行任何处理,它们只描述了流应该如何处理被建造。将这些蓝图转换为具有实时数据的工作流的过程称为实现

实现流的核心方法称为run()RunnableGraph类中的definedSink.fold。运行流的所有其他方法(例如runWithSink上的Source)最终会委托给此方法。您可以看到此方法返回Mat。也就是说,实现流产生物化值。

例如,有一个接收器将流中的所有值组合成单个值,它由Source.queue构成。但是你怎么得到这个价值呢?由于流是异步运行的,因此该值的自然类型为Future[T],其中T是折叠累加器的类型。事实证明,Sink.fold会返回Sink[In, Future[T]],也就是说,此Future[T]是其具体化值,因此,当您实现它时,您会获得Future[T]的实例,然后您可以在您自己的代码中使用以进行进一步处理:如果流正确完成,它将以值结束,如果流已因异常终止,它将以失败结束。

通过组合汇,源和流(以及其他类型的图)构建的图的每个部分可能具有相关的物化值。例如,to的具体化值是一个队列,您可以使用该队列在元素实现后将元素推送到流中,Sink.actorSubscriber的具体化值为ActorRef,您可以使用它与actor交互(在实现流时由materializer创建)。另一方面,有Flow.map这是一个没有有意义的物化值的流(当你只将纯函数应用于流时,你无法从外部控制),因此它的物化值是{{1} },基本上是NotUsed

当然,流的不同部分可能包含它们自己的物化价值。例如,没有什么可以阻止您合并UnitSource.queue。但是Sink.fold只能返回一个物化值。为了解决这个问题,通常在RunnableGraph.run() s,Sink和其他图表上组合方法有两种变体,通常称为Flowmethod,例如toMatKeep。第二种变体允许您选择如何组合您要加入的流的具体化值。例如,您可以将它们放入元组中以获取它们:

methodMat

默认组合方法(没有val (queue, future) = Source.queue[Int](10, OverflowStrategy.fail) .map(x => x + 10) .toMat(Sink.fold(0)(_ + _))(Keep.both) .run() 后缀)通常选择左或右物化值,具体取决于对这种特定类型流最自然的事情。 {{3}}对象包含返回左,右或两个参数的便捷方法,特别是为了将它们用作Mat方法的最后一个参数,但没有什么能阻止您编写自己的组合函数。