我有这样的来源:
val queueP : Promise[SourceQueueWithComplete[List[String]]] = Promise()
val source = Source.queue(Constants.CHUNK_SIZE, OverflowStrategy.backpressure).mapMaterializedValue {
q : SourceQueueWithComplete[List[String]] => {
queueP.success(q)
q
}
}.watchTermination() {
case (_,f) => f.recoverWith {
case t : Exception => {
queueP.tryFailure(new Exception)
Future.failed(t)
}
}
}
我提供的项目:
queueP.future.map(f => f.offer(someList))
但当我在另一端沉没时:
val sink = Sink.foreach[List[String]](someList => {
...
})
val flow = rowsSource.to(sink)
flow.run
我收到的物品不按顺序排列,这首先打破了排队的目的。有没有办法强制项目按顺序提供给队列?
答案 0 :(得分:2)
由于offer
您的元素是mapMaterializedValue
调用的一部分,因此每次要提交元素时,实际上都需要实现(即运行)Source.queue
。
作为副作用,您会使元素无序,因为每个流实现都是异步发生的。
更健康的问题解决方法是运行单个图表,获取一个队列,并向其提交多个元素。请参阅下面的代码示例:
val queue: SourceQueueWithComplete[List[String]] =
Source.queue[List[String]](Constants.CHUNK_SIZE, OverflowStrategy.backpressure)
.to(Sink.foreach { list ⇒ /* do stuff */ })
.run()
queue.offer(List("a", "b"))
queue.offer(List("c", "d"))