elasticsearch 对于Akka Streams,我如何知道源何时完成?
我有一个Alpakka Elasticsearchelasticsearch 对于Akka Streams,我如何知道源何时完成?,elasticsearch,akka,akka-stream,reactive-streams,alpakka,elasticsearch,Akka,Akka Stream,Reactive Streams,Alpakka,我有一个Alpakka ElasticsearchSink,我在请求之间保留着它。当我收到一个请求时,我从HTTP请求中创建一个Source,并将其转换为ElasticsearchWriteMessages的Source,然后使用mySource.runWith(thelasticseaschsink)运行该请求 当源代码完成时,如何通知我?似乎什么有用的东西都没有实现 源代码的完成是否会传递给接收器,这意味着我每次都必须创建一个新的 如果上面的回答是肯定的,是否会使用Flow.fromSour
Sink
,我在请求之间保留着它。当我收到一个请求时,我从HTTP请求中创建一个Source
,并将其转换为ElasticsearchWriteMessage
s的Source
,然后使用mySource.runWith(thelasticseaschsink)
运行该请求
Flow.fromSourceAndSink
help以某种方式将它们解耦我的目标是知道HTTP下载何时完成(包括通过它所经过的
),并能够重用接收器。您可以随意传递流的单个部分,甚至可以传递整个executabe图(这些是不可变的)。run()调用具体化流,但不会更改图形或其部分
(一)
既然您想知道HttpDownload何时通过流,为什么不使用Future[Done]的完整图形呢?假设您对elasticsearch的调用是异步的,这应该是相等的,因为您的接收器只是触发调用而不等待。
您还可以使用Source.queue()将消息添加到队列中,然后队列将重用定义的图,以便在需要处理时添加新消息。这一个还具体化了SourceQueueWithComplete,允许您停止流。
除此之外,在需要的地方重用水槽,而无需等待另一个流使用它
2) 如上所述:不需要多次实例化接收器
致以最良好的祝愿,
Andi您可以随意传递流的单个部分,甚至可以传递整个executabe图(这些是不可变的)。run()调用具体化流,但不会更改图形或其部分
(一)
既然您想知道HttpDownload何时通过流,为什么不使用Future[Done]的完整图形呢?假设您对elasticsearch的调用是异步的,这应该是相等的,因为您的接收器只是触发调用而不等待。
您还可以使用Source.queue()将消息添加到队列中,然后队列将重用定义的图,以便在需要处理时添加新消息。这一个还具体化了SourceQueueWithComplete,允许您停止流。
除此之外,在需要的地方重用水槽,而无需等待另一个流使用它
2) 如上所述:不需要多次实例化接收器
致以最良好的祝愿,
Andi事实证明,Alpakka的Elasticsearch库也支持流形状,因此我可以让我的源代码通过它,并通过任何实现未来的接收器运行它Sink.foreach
在这里可以很好地用于测试目的,例如在中
定义es.flow
,然后
val graph = response.entity.withSizeLimit(MaxFeedSize).dataBytes
.via(scanner)
.via(CsvToMap.toMap(Utf8))
.map(attrs => Product(attrs("id").decodeString(Utf8), attrs.mapValues(_.decodeString(Utf8))))
.via(es.flow)
val futureDone = graph.runWith(Sink.foreach(println))
futureDone onComplete {
case Success(_) => println("Done")
case Failure(e) => println(e)
}
事实证明,Alpakka的Elasticsearch库也支持流形状,所以我可以让我的源代码通过它,并通过任何实现未来的接收器运行它Sink.foreach
在这里可以很好地用于测试目的,例如在中
定义es.flow
,然后
val graph = response.entity.withSizeLimit(MaxFeedSize).dataBytes
.via(scanner)
.via(CsvToMap.toMap(Utf8))
.map(attrs => Product(attrs("id").decodeString(Utf8), attrs.mapValues(_.decodeString(Utf8))))
.via(es.flow)
val futureDone = graph.runWith(Sink.foreach(println))
futureDone onComplete {
case Success(_) => println("Done")
case Failure(e) => println(e)
}
但是,我如何才能真正获得一个未来[完成]
?Akka http的ResponseEntity
数据字节源具体化任何(def-dataBytes:source[ByteString,Any]
),我不知道这是为什么或者应该是什么。我指的是接收器的具体化值。从你所描述的,你真的需要它的来源?对于sink,您可以使用sink.foreach,它实现了一个未来[完成]。请尝试在源上指定为什么需要它,以防您需要它。如果您确实需要它,您可以添加viaMat并为您的源编写自定义物化,它提供状态,然后通过(Keep.right)或(Keep.left)将其传递到流中。今晚我没有时间写一个例子,但是如果你需要的话,请发布一些例子(简化的)代码。我在这里放了一个小程序:。正如您所看到的,当我运行它时,我得到了一个未使用的
,因此我在那里没有什么可处理的。但是,我如何真正得到一个未来[完成]
?Akka http的ResponseEntity
数据字节源具体化任何(def-dataBytes:source[ByteString,Any]
),我不知道这是为什么或者应该是什么。我指的是接收器的具体化值。从你所描述的,你真的需要它的来源?对于sink,您可以使用sink.foreach,它实现了一个未来[完成]。请尝试在源上指定为什么需要它,以防您需要它。如果您确实需要它,您可以添加viaMat并为您的源编写自定义物化,它提供状态,然后通过(Keep.right)或(Keep.left)将其传递到流中。今晚我没有时间写一个例子,但是如果你需要的话,请发布一些例子(简化的)代码。我在这里放了一个小程序:。正如您所看到的,当我运行它时,我得到了一个未使用的,因此我没有什么可处理的。