如何组合2个不同类型的接收器?

时间:2017-07-05 12:41:46

标签: scala akka-stream

我想使用Alpakka将文件上传到S3,同时用Tika解析它以获取其MimeType。

目前我有3个部分的图表:

bootstrap 3.3.7

我想在一个地方获得两个结果,例如:

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)]

但是我在组成Sinks时遇到了麻烦。我在API和文档中发现的方法假设组合接收器的类型相同,或者我是Zipping Flows,而不是Sinks。

在这种情况下建议的方法是什么?

1 个答案:

答案 0 :(得分: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()