我想使用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。
在这种情况下建议的方法是什么?
答案 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()