2017-07-05 34 views
0

我想用Alpakka上傳文件到S3中,同時用Tika解析它以獲得它的MimeType。如何組合2種不同類型的水槽?

我有3個部分圖線的那一刻:

val fileSource: Source[ByteString, Any] // comes from Akka-HTTP 
val fileUpload: Sink[ByteString, Future[MultipartUploadResult]] // created by S3Client from Alpakka 
val mimeTypeDetection: Sink[ByteString, Future[MediaType.Binary]] // my implementation using Apache Tika 

我想在一個地方同時獲得結果,是這樣的:

Future[(MultipartUploadResult, MediaType.Binary)] 

我與廣播的部分沒有問題:

val broadcast = builder.add(Broadcast[ByteString](2)) 

source ~> broadcast ~> fileUpload 
      broadcast ~> mimeTypeDetection 

但是,我在編寫接收器時遇到了麻煩。我在API和文檔中發現的方法假定任一組合接收器都是相同類型的,或者我是壓縮流而不是接收器。

這種情況下建議的方法是什麼?

回答

1

兩種方式:

1)使用alsoToMat(更容易,沒有GraphDSL,足以讓你的例子)

val mat1: (Future[MultipartUploadResult], Future[Binary]) = 
    fileSource 
    .alsoToMat(fileUpload)(Keep.right) 
    .toMat(mimeTypeDetection)(Keep.both) 
    .run() 

2)使用GraphDSL與定製化的值(更詳細的,更靈活)。關於這個的更多信息在docs

val mat2: (Future[MultipartUploadResult], Future[Binary]) = 
    RunnableGraph.fromGraph(GraphDSL.create(fileUpload, mimeTypeDetection)((_, _)) { implicit builder => 
     (fileUpload, mimeTypeDetection) => 
     import GraphDSL.Implicits._ 
     val broadcast = builder.add(Broadcast[ByteString](2)) 

     fileSource ~> broadcast ~> fileUpload 
         broadcast ~> mimeTypeDetection 
     ClosedShape 
    }).run()