如何测试是否已向Kafka提交补偿

时间:2018-12-19 11:49:44

标签: scala unit-testing apache-kafka akka-stream

我有一个从Kafka主题中读取的Akka Stream Kafka来源。

我有一个简单的任务,允许禁用消息偏移量的提交。通常通过调用commitScaladsl来完成提交。

我的问题是我不知道如何测试偏移量是否已提交。

我们通常使用EmbeddedKafka进行测试,但是我还没有想出一种方法来询问最后提交的偏移量。

这是我编写的测试示例:

  "KafkaSource" should {
    "consume from a kafka topic and pass the message " in {
      val commitToKafka = true
      val key = "key".getBytes
      val message = "message".getBytes

      withRunningKafka {

        val source = getKafkaSource(commitToKafka)
        val (_, sub) = source
          .toMat(TestSink.probe[CommittableMessage[Array[Byte], Array[Byte], ConsumerMessage.CommittableOffset]])(Keep.both)
          .run()

        val messageOpt = publishAndRequestRetry(topic, key, message, sub, retries)
        messageOpt should not be empty
        messageOpt.get.value shouldBe message
      }
    }

现在,我要检查是否已提交偏移量。

2 个答案:

答案 0 :(得分:1)

Kafka通过TopicName和PartitionID存储偏移量。因此,您可以使用.committed().position方法来检查Kafka使用者的上次提交的偏移量或当前位置。

committed():获取给定分区的最后提交的偏移量(无论此提交是否发生在此进程中)。

position():获取将要提取的下一条记录的偏移量(如果存在具有该偏移量的记录)。

答案 1 :(得分:0)

我终于使用ConsumerInterceptor解决了它,定义为:

class Interceptor extends ConsumerInterceptor[Array[Byte], Array[Byte]] {
  override def onConsume(records: ConsumerRecords[Array[Byte], Array[Byte]]): ConsumerRecords[Array[Byte], Array[Byte]] = records

  override def onCommit(offsets: java.util.Map[TopicPartition, OffsetAndMetadata]): Unit = {
    import scala.collection.JavaConverters._
    OffsetRecorder.add(offsets.asScala)
  }

  override def close(): Unit = {}

  override def configure(configs: java.util.Map[String, _]): Unit = OffsetRecorder.clear

}
提交完成后会调用

onCommit,在这种情况下,我只是记录它。我使用configure方法在每次测试开始时都有空记录。

然后,在为源创建使用者设置时,我将拦截器添加为属性:

  ConsumerSettings(system, new ByteArrayDeserializer, new ByteArrayDeserializer)
    .withBootstrapServers(s"localhost:${kafkaPort}")
    .withGroupId("group-id")
    .withProperty(ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, "package.of.my.test.Interceptor")