add kafka client
parent
629728f865
commit
8a9732eff9
|
|
@ -0,0 +1,20 @@
|
||||||
|
plugins {
|
||||||
|
application
|
||||||
|
kotlin("jvm")
|
||||||
|
kotlin("plugin.serialization")
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
application {
|
||||||
|
mainClass.set("de.itkl.kafkaAdmin.KafkaAdminApplicationKt.main")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation("org.apache.kafka:kafka-clients:3.4.0")
|
||||||
|
implementation("com.github.ajalt.clikt:clikt:4.4.0")
|
||||||
|
implementation(libs.bundles.kotlinx)
|
||||||
|
implementation(libs.bundles.logging)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
package de.itkl.kafkaAdmin
|
||||||
|
|
||||||
|
import de.itkl.kafkaAdmin.KafkaAdmin.KafkaTopic
|
||||||
|
import kotlinx.coroutines.async
|
||||||
|
import kotlinx.coroutines.awaitAll
|
||||||
|
import kotlinx.coroutines.coroutineScope
|
||||||
|
import kotlinx.coroutines.future.asDeferred
|
||||||
|
import org.apache.kafka.clients.admin.Admin
|
||||||
|
import org.apache.kafka.common.TopicCollection
|
||||||
|
import org.apache.kafka.common.Uuid
|
||||||
|
|
||||||
|
typealias ListOfTopics = List<KafkaTopic>
|
||||||
|
|
||||||
|
class KafkaAdmin(config: KafkaAdminConfig) {
|
||||||
|
private val client = Admin.create(config.intoProperties())
|
||||||
|
|
||||||
|
inner class KafkaTopic(
|
||||||
|
val uuid: Uuid,
|
||||||
|
val name: String,
|
||||||
|
) {
|
||||||
|
override fun toString(): String {
|
||||||
|
return "Topic uuid: $uuid, name: $name"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun ListOfTopics.toTopicCollection() = TopicCollection.ofTopicNames(map { it.name })
|
||||||
|
|
||||||
|
suspend fun listTopics(): List<KafkaTopic> {
|
||||||
|
val listing = client.listTopics()
|
||||||
|
return listing.listings().toCompletionStage().asDeferred().await()
|
||||||
|
.map { topicListing ->
|
||||||
|
KafkaTopic(
|
||||||
|
uuid = topicListing.topicId(),
|
||||||
|
name = topicListing.name(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class AlterTopicResult(val name: String, val error: Throwable?)
|
||||||
|
|
||||||
|
suspend fun deleteTopics(topics: ListOfTopics) =
|
||||||
|
coroutineScope {
|
||||||
|
client.deleteTopics(topics.toTopicCollection())
|
||||||
|
.topicNameValues()
|
||||||
|
.map { (name, future) ->
|
||||||
|
name to future.toCompletionStage().asDeferred()
|
||||||
|
}
|
||||||
|
.map { (name, future) ->
|
||||||
|
async {
|
||||||
|
val error = runCatching {
|
||||||
|
future.await()
|
||||||
|
}.exceptionOrNull()
|
||||||
|
name to error
|
||||||
|
}
|
||||||
|
}.awaitAll()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
package de.itkl.kafkaAdmin
|
||||||
|
|
||||||
|
fun createClient(): KafkaAdmin {
|
||||||
|
val config = KafkaAdminConfig(bootstrapServers = "localhost:9092")
|
||||||
|
val admin = KafkaAdmin(config)
|
||||||
|
return admin
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun run() {
|
||||||
|
val admin = createClient()
|
||||||
|
val topics = admin.listTopics()
|
||||||
|
val toDelete = topics
|
||||||
|
.filter { topic -> topic.name.startsWith("training-service-stream") }
|
||||||
|
admin.deleteTopics(toDelete)
|
||||||
|
.forEach { (topicName, error) ->
|
||||||
|
println("$topicName ${error ?: "success"}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun main() {
|
||||||
|
run()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
package de.itkl.kafkaAdmin
|
||||||
|
|
||||||
|
import org.apache.kafka.clients.admin.AdminClientConfig
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
data class KafkaAdminConfig(
|
||||||
|
val bootstrapServers: String,
|
||||||
|
) {
|
||||||
|
fun intoProperties(): Properties {
|
||||||
|
return Properties().apply {
|
||||||
|
this[AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG] = bootstrapServers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
package de.itkl.kafkaAdmin
|
||||||
|
|
@ -16,3 +16,4 @@ fun includeDir(dir: String) {
|
||||||
rootProject.name = "xssak"
|
rootProject.name = "xssak"
|
||||||
include("app")
|
include("app")
|
||||||
includeDir("modules")
|
includeDir("modules")
|
||||||
|
includeDir("apps")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue