在Akka流中,源[Out,Mat]或Sink [In,Mat]中的Mat代表什么。什么时候才能使用?
答案 0 :(得分:25)
Mat
type参数表示此流的具体化值的类型。
请记住,在Akka中Source
,Flow
,Sink
(嗯,所有图表)都只是蓝图 - 它们本身不进行任何处理,它们只描述了流应该如何处理被建造。将这些蓝图转换为具有实时数据的工作流的过程称为实现。
实现流的核心方法称为run()
,RunnableGraph
类中的defined为Sink.fold
。运行流的所有其他方法(例如runWith
或Sink
上的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
。
当然,流的不同部分可能包含它们自己的物化价值。例如,没有什么可以阻止您合并Unit
和Source.queue
。但是Sink.fold
只能返回一个物化值。为了解决这个问题,通常在RunnableGraph.run()
s,Sink
和其他图表上组合方法有两种变体,通常称为Flow
和method
,例如toMat
和Keep
。第二种变体允许您选择如何组合您要加入的流的具体化值。例如,您可以将它们放入元组中以获取它们:
methodMat
默认组合方法(没有val (queue, future) = Source.queue[Int](10, OverflowStrategy.fail)
.map(x => x + 10)
.toMat(Sink.fold(0)(_ + _))(Keep.both)
.run()
后缀)通常选择左或右物化值,具体取决于对这种特定类型流最自然的事情。 {{3}}对象包含返回左,右或两个参数的便捷方法,特别是为了将它们用作Mat
方法的最后一个参数,但没有什么能阻止您编写自己的组合函数。