[英]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.