![](/img/trans.png)
[英]Akka Streams - How to keep materialized value of an auxiliary Sink in a Graph
[英]Convert Sink to Graph(SinkShape) in Akka Streams?
我有這樣的事情:
implicit val system = ActorSystem("actorSystem")
implicit val materializer = ActorMaterializer()
val (ref: ActorRef, publisher: Publisher[(String, String, String)]) =
Source.actorRef[(String, String, String)](bufferSize = 1000, OverflowStrategy.fail)
.toMat(transferFTP(_))(Keep.both)
.run()
def transferFTP(data: (String, String, String)): Sink[ByteString, Future[IOResult]] = {
// ...
}
在我讀過的每個例子中, toMat()
將Sink
作為參數,但編譯器需要Graph[SinkShape[(String,String,String)], NotInferedMat2]
。
toMat
確實需要一個Sink
。 Sink[(String, String, String), _]
是Graph[SinkShape[(String, String, String)], _]
(換句話說,前者是后者的子類)。 其中一個問題是你傳入了一個Sink[ByteString, _]
。 此外,當您的Sink
器的具體化值是Future[IOResult]
時,您期望Publisher[(String, String, String)]
Future[IOResult]
。
以下是類型對齊的示例,從而使編譯器滿意:
val tupleToByteString: ((String, String, String)) => ByteString = ???
val transferFTP: Sink[ByteString, Future[IOResult]] = ???
val (ref: ActorRef, sink: Future[IOResult]) =
Source.actorRef[(String, String, String)](bufferSize = 1000, OverflowStrategy.fail)
.via(Flow.fromFunction(tupleToByteString)) // alternatively: .map(tupleToByteString)
.toMat(transferFTP)(Keep.both)
.run()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.