Akka:有没有一个永远不会拉的水槽?

时间:2019-04-21 16:20:36

标签: akka akka-stream

需要一个永不抽出的Sink,用于单元测试。 是否已经可用,或者我需要自己编写代码?

请注意,Sink.ignore()不会帮助您,因为它总是会拉。 我需要一个永不拉的水槽。

2 个答案:

答案 0 :(得分:2)

直接回答

您可以创建一个永不调用Subscription.request的{​​{3}}:

import org.reactivestreams.Subscriber

def nonSubscriber[T] : Subscriber[T] = new Subscriber[T] {
  override def onComplete() : Unit = {}

  override def onError(throwable: java.lang.Throwable) : Unit = {}

  //should never be called therefore definition is not implemented
  override def onNext(t: T) : Unit = ???

  //does not call s.request
  override def onSubscribe(s: Subscription) : Unit = {}
} 

然后可以使用此订户实例化Sink

import akka.NotUsed
import akka.stream.scaladsl.Sink

def nonSubscribingSink[T] : Sink[T, NotUsed] = 
  Sink.fromSubscriber[T](nonSubscriber[T])

间接答案

该问题的性质表明您正在将“业务逻辑”与akka流逻辑混合在一起。您可能要考虑使用org.reactivestreams.Subscriber来避免不必要的问题。

答案 1 :(得分:1)

最终创建了自己的实现:

// sink that does not pull
val snkStage = object : GraphStage<SinkShape<Message>>() {
    val shape = SinkShape(Inlet.create<Message>("in"))
    override fun shape() = shape
    override fun createLogic(inheritedAttributes: Attributes): GraphStageLogic = object : GraphStageLogic(shape) {
        init {
            setHandler(shape.`in`()) {}
        }
    }
}

但是后来决定使用Sink.ignore()Source.maybe()的更常规组合。