All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.jchanghong.kafka.KafkaConsumerRunnerManualPartition.kt Maven / Gradle / Ivy

package com.github.jchanghong.kafka

import cn.hutool.core.thread.ThreadUtil
import okhttp3.internal.closeQuietly
import org.apache.kafka.clients.consumer.ConsumerRecord
import org.apache.kafka.clients.consumer.ConsumerRecords
import org.apache.kafka.clients.consumer.KafkaConsumer
import org.apache.kafka.common.TopicPartition
import org.slf4j.LoggerFactory
import java.time.Duration
import java.util.function.Consumer

/** 手动分配分区,。从0开始*/
class KafkaConsumerRunnerManualPartition(
	val kafkaHelper: KafkaHelper,
	topics: List,
	private val partition: Int,
	val messageHandle: Consumer>
) :
	Runnable {
	private val log = LoggerFactory.getLogger(KafkaConsumerRunnerManualPartition::class.java)
	private val list: List = topics.map { TopicPartition(it, partition) }
	private var consumer: KafkaConsumer? = null

	/** 异常后重新初始化!!!!!*/
	fun reInitKafkaConsumer(): Unit {
		kotlin.runCatching { consumer?.commitSync() }
		kotlin.runCatching { consumer?.close() }
		kotlin.runCatching { consumer?.closeQuietly() }
		consumer = null
		consumer = KafkaConsumer(kafkaHelper.mProps)
		consumer?.assign(list)
	}

	override fun run() {
		reInitKafkaConsumer()
		while (true) {
			try {
				if (consumer == null) {
					reInitKafkaConsumer()
				}
				pollData()
			} catch (e: Throwable) {
				log.error(e.localizedMessage + "kafka分区${partition} poll异常,重新初始化消费者后停止3秒")
				reInitKafkaConsumer()
				ThreadUtil.sleep(3000)
			}
		}
	}

	private fun pollData() {
		consumer ?: return
		val consumerRecords: ConsumerRecords = consumer!!.poll(Duration.ofMillis(30000)) ?: return
		if (consumerRecords.isEmpty) return
		consumerRecords.forEach {
			try {
				if (it == null) return@forEach
				messageHandle.accept(it)
			} catch (e: Throwable) {
				log.error(e.localizedMessage + "kafka消息处理异常 ${it.topic()} ${it.partition()}")
			}
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy