2016-09-19 59 views
0

我試圖運行一個簡單的Akka Stream File Sink示例,但沒有成功。我可以創建一個Source,運行Flow,然後創建一個文件,但ByteString不會寫入文件。而如果我嘗試將流量輸出打印到控制檯,我可以這樣做。我在這裏錯過了什麼嗎?Akka Stream:無法寫入文件接收器

import akka.stream._ 
import akka.stream.scaladsl._ 
import akka.{ NotUsed, Done} 
import akka.actor.ActorSystem 
import akka.util.ByteString 
import scala.concurrent._ 
import scala.concurrent.duration._ 
import java.nio.file.Paths 

object First extends App { 

    val source: Source[Int, NotUsed] = Source (1 to 100) 

    implicit val system = ActorSystem("QuickStart") 
    implicit val materializer = ActorMaterializer() 

    // works: prints 1-100 
    //source.runForeach(println) (materializer) 

    val factorials = source.scan(BigInt(1))((acc,next) => acc * next) 

    // there is no content in the Sink (file) 
    /**val result = 
    factorials 
    .map(num => ByteString(s"${num}\n")) 
    .runWith(FileIO.toPath(Paths.get("factorials.txt"))) 
**/ 

    def lineSink(fileName: String): Sink[String, Future[IOResult]] = 
    Flow[String] 
    .map(s => ByteString(s + "\n")) 
    .toMat(FileIO.toPath(Paths.get(fileName))) (Keep.right) 

    //There is no content in the Sink. 
    factorials.map(_.toString).runWith(lineSink("factorials.txt")) 

system.terminate() 

} 

build.sbt有:提前爲你的時間

name := "akkaGuide" 
    version := "1.0" 
    scalaVersion := "2.11.8" 
    libraryDependencies ++= Seq(
     "com.typesafe.akka" %% "akka-stream" % "2.4.10" 
    ) 

感謝。

回答

6

我想你可能會過早地終止。請等待,直到Future完成:

val result = factorials.map(_.toString).runWith(lineSink("factorials.txt")) 
import system.dispatcher 
result.onComplete { _ => system.terminate() } 
+0

謝謝Brian Kent。有效 ! – Raxbangalore