Akka 在消费者API中使用createDrainingControl?

Akka 在消费者API中使用createDrainingControl?,akka,kafka-consumer-api,akka-stream,alpakka,Akka,Kafka Consumer Api,Akka Stream,Alpakka,我正在阅读阿尔帕卡卡夫卡的消费者API文档。我偶然发现了这段代码。据我所知,偏移量是使用msg.committeableoffset()提交的。那么为什么我们需要.toMat()和mapMaterializedValue()。我不能将其连接到水槽。忽略() 无法附加到Sink.ignore,因为您已经附加了committer.Sink。 但您可以放弃具体化的值 该示例使用toMat with Keep.both来保留两个具体化的值,即源控件和接收器的Future[Done]。 使用这两个值,它在

我正在阅读阿尔帕卡卡夫卡的消费者API文档。我偶然发现了这段代码。据我所知,偏移量是使用msg.committeableoffset()提交的。那么为什么我们需要.toMat()和mapMaterializedValue()。我不能将其连接到水槽。忽略()


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

该示例使用toMat with Keep.both来保留两个具体化的值,即源控件和接收器的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);

感谢您的解释,正如您提到的,DrainingControl允许我停止流或排放流。如果我没有实现它,消费者会不会不选择主题中的新卡夫卡消息?我想我是想知道drainControl的用法
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);