消费者API中使用createDrainingControl吗?

时间:2019-04-20 12:44:51

标签: akka kafka-consumer-api akka-stream alpakka

我正在浏览Alpakka中针对Kafka的Consumer API的文档。我遇到了这段代码。据我了解,偏移量是使用msg.committableOffset()提交的。那为什么我们需要.toMat()和mapMaterializedValue()。我不能只将它附加到Sink.Ignore()吗?

Consumer.committableSource(consumerSettings, Subscriptions.topics(topic))
      .mapAsync(
          1,
          msg ->
              business(msg.record().key(), msg.record().value())
                  .thenApply(done -> msg.committableOffset()))
      .toMat(Committer.sink(committerSettings.withMaxBatch(1)), Keep.both())
      .mapMaterializedValue(Consumer::createDrainingControl)
      .run(materializer);

1 个答案:

答案 0 :(得分:1)

您无法附加到Sink.ignore,因为您已经附加了Commiter.Sink。 但是您可以舍弃具体化的值。

该示例将toMat与Keep.both一起使用来保留两个物化值,即来自源的Control和来自接收器的Future [Done]。 使用这两个值,它会在mapMaterializedValue中创建一个DrainingControl,该控件可让您停止流或在停止之前将其排空,或者在流停止时得到通知。

如果您不关心此控件(尽管应该),则可以使用

Consumer.committableSource(consumerSettings, Subscriptions.topics(topic))
      .mapAsync(
          1,
          msg ->
              business(msg.record().key(), msg.record().value())
                  .thenApply(done -> msg.committableOffset()))
      .to(Committer.sink(committerSettings.withMaxBatch(1)))
      .run(materializer);