如何按照Source中提供的顺序从Sink获取项目?

时间:2017-02-21 20:16:56

标签: scala akka akka-stream

我有这样的来源:

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

我收到的物品不按顺序排列,这首先打破了排队的目的。有没有办法强制项目按顺序提供给队列?

1 个答案:

答案 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"))