improve kafka consumer group gradle task
This commit is contained in:
parent
8a57f9daea
commit
99a7167485
2 changed files with 49 additions and 28 deletions
|
|
@ -2,60 +2,76 @@ package dev.adamko.kafkatorio.task
|
|||
|
||||
import dev.adamko.kafkatorio.gradle.execCapture
|
||||
import org.gradle.api.DefaultTask
|
||||
import org.gradle.api.file.DirectoryProperty
|
||||
import org.gradle.api.logging.LogLevel
|
||||
import org.gradle.api.tasks.Destroys
|
||||
import org.gradle.api.tasks.Input
|
||||
import org.gradle.api.tasks.Internal
|
||||
import org.gradle.api.tasks.TaskAction
|
||||
import org.intellij.lang.annotations.Language
|
||||
import org.jetbrains.kotlin.util.parseSpaceSeparatedArgs
|
||||
|
||||
abstract class KafkaConsumersResetTask : DefaultTask() {
|
||||
abstract class KafkaConsumerGroupsTask : DefaultTask() {
|
||||
|
||||
@get:Input
|
||||
val bootstrapServer: String = "localhost:9092"
|
||||
@get:Input
|
||||
val kafkaContainerName: String = "kafka"
|
||||
@get:Destroys
|
||||
abstract val kafkaStateDir: DirectoryProperty
|
||||
val kafkaDockerContainerName: String = "kafka"
|
||||
|
||||
@get:Internal
|
||||
protected val bootstrapArg = "--bootstrap-server $bootstrapServer"
|
||||
|
||||
@TaskAction
|
||||
fun resetKafkaConsumers() {
|
||||
val bootstrapArg = "--bootstrap-server $bootstrapServer"
|
||||
abstract class ResetAll : KafkaConsumerGroupsTask() {
|
||||
|
||||
val allGroups = dockerExec(
|
||||
@get:Input
|
||||
@Language("Shell Script")
|
||||
val resetCommand: String =
|
||||
"""
|
||||
/kafka/bin/kafka-consumer-groups.sh --list $bootstrapArg
|
||||
/kafka/bin/kafka-consumer-groups.sh --execute --reset-offsets --all-topics --to-earliest $bootstrapArg
|
||||
""".trimIndent()
|
||||
).lines()
|
||||
.filter { it.trim().isNotBlank() }
|
||||
|
||||
allGroups
|
||||
.forEach { group ->
|
||||
@TaskAction
|
||||
fun reset() {
|
||||
getAllGroups().forEach { group ->
|
||||
logger.lifecycle("Resetting group $group\n---")
|
||||
dockerExec(
|
||||
"""
|
||||
/kafka/bin/kafka-consumer-groups.sh --group $group --execute --reset-offsets --all-topics --to-earliest $bootstrapArg
|
||||
""".trimIndent()
|
||||
)
|
||||
dockerExec("$resetCommand --group $group")
|
||||
logger.lifecycle("---")
|
||||
}
|
||||
|
||||
project.delete {
|
||||
delete(kafkaStateDir)
|
||||
}
|
||||
}
|
||||
|
||||
abstract class DeleteAll : KafkaConsumerGroupsTask() {
|
||||
|
||||
@get:Input
|
||||
@Language("Shell Script")
|
||||
val deleteCommand: String =
|
||||
"""
|
||||
/kafka/bin/kafka-consumer-groups.sh --delete $bootstrapArg
|
||||
""".trimIndent()
|
||||
|
||||
@TaskAction
|
||||
fun reset() {
|
||||
val groups = getAllGroups().joinToString(" ") { group -> "--group $group" }
|
||||
dockerExec("$deleteCommand $groups")
|
||||
}
|
||||
}
|
||||
|
||||
@Internal
|
||||
protected fun getAllGroups(): List<String> = dockerExec(
|
||||
"""
|
||||
/kafka/bin/kafka-consumer-groups.sh --list $bootstrapArg
|
||||
""".trimIndent()
|
||||
).lines()
|
||||
.filter { it.trim().isNotBlank() }
|
||||
|
||||
|
||||
// fun reset(applicationId: String) = """
|
||||
// /kafka/bin/kafka-streams-application-reset.sh --application-id $applicationId --force --to-earliest
|
||||
// """.trimIndent()
|
||||
|
||||
private fun dockerExec(
|
||||
protected fun dockerExec(
|
||||
@Language("Shell Script")
|
||||
cmd: String
|
||||
): String = project.execCapture {
|
||||
logging.captureStandardOutput(LogLevel.LIFECYCLE)
|
||||
commandLine = parseSpaceSeparatedArgs(""" docker exec $kafkaContainerName $cmd """)
|
||||
commandLine = parseSpaceSeparatedArgs(""" docker exec $kafkaDockerContainerName $cmd """)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import dev.adamko.kafkatorio.task.KafkaConsumersResetTask
|
||||
import dev.adamko.kafkatorio.task.KafkaConsumerGroupsTask
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
|
||||
plugins {
|
||||
|
|
@ -63,9 +63,14 @@ tasks.withType<KotlinCompile> {
|
|||
}
|
||||
|
||||
|
||||
val kafkaConsumersReset by tasks.registering(KafkaConsumersResetTask::class) {
|
||||
val kafkaStateDirDelete by tasks.registering(Delete::class) {
|
||||
group = project.name
|
||||
mustRunAfter(kafkaConsumersDelete)
|
||||
delete(layout.buildDirectory.dir("kafka-state"))
|
||||
}
|
||||
|
||||
val kafkaConsumersDelete by tasks.registering(KafkaConsumerGroupsTask.DeleteAll::class) {
|
||||
group = project.name
|
||||
kafkaStateDir.set(project.layout.buildDirectory.dir("kafka-state"))
|
||||
}
|
||||
|
||||
//tasks.run.configure {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue