簡體   English   中英

編寫測試以在多線程環境中使用 Kafka 消費者

[英]Writing tests to use Kafka consumer in multi-threading environment

我正在嘗試在一個單獨的線程中創建一個 kafka 消費者,該線程使用來自 kafka 主題的數據。 為此,我擴展了ShutdownableThread抽象類並提供了doWork方法的實現。 我的代碼是這樣的 -

abstract class MyConsumer(topic: String) extends ShutdownableThread(topic) {
    val props: Properties = ???
    private val consumer = new KafkaConsumer[String, String](props)
    consumer.subscribe(List(topic).asJava)

    def process(value: String): Unit // Abstract method defining what to do with each record

    override def doWork(): Unit = {
        for (record <- consumer.poll(Duration.ofMillis(1000)).asScala)
            process(record.value())
    }
}

現在在我的測試中,我創建消費者提供process()方法的實現,該方法只是改變一個變量,然后調用它的start()方法來啟動線程。

var mutVar = "initial_value"

val consumer = new MyConsumer("test_topic") {
    override def process(value: String): Unit = mutVar = "updated_value"
}

consumer.start()
assert(mutVar === "updated_value")

消費者確實使用了來自 kafka 的消息,但在測試完成之前它不會更新它,因此測試失敗。 所以,我試圖讓主線程進入睡眠狀態。 但它拋出ConcurrentModificationException異常消息 - KafkaConsumer is not safe for multi-threaded access

知道我的方法有什么問題嗎? 提前致謝。

不得不讓主線程休眠幾秒鍾,以允許消費者使用來自 kafka 主題的消息並將其存儲在可變變量中。 添加 - 啟動消費者后的Thread.sleep(5000)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM