- 修复 Kafka Listener 并发配置包含尾部空格时触发 NumberFormatException 的问题

- 移除 SysLogProcessor 注解中对并发配置的直接字符串解析
- 改由 Kafka 容器工厂统一处理并发度配置
- 统一两个 consumer 模块各环境的并发配置格式
- 清理 application.properties 中可能影响类型转换的行尾空格
- 更新 Kafka 监听器拓扑回归测试,防止问题再次引入
This commit is contained in:
王绍宏
2026-09-02 13:54:13 +08:00
parent f53661931f
commit b61ec2e37c
12 changed files with 31 additions and 31 deletions
@@ -66,7 +66,7 @@ spring.kafka.consumer.properties.session.timeout.ms=45000
spring.kafka.consumer.fetch-min-size= 1048576 spring.kafka.consumer.fetch-min-size= 1048576
spring.kafka.listener.ack-mode= manual spring.kafka.listener.ack-mode= manual
spring.kafka.listener.concurrency= 2 spring.kafka.listener.concurrency=2
spring.kafka.listener.type=batch spring.kafka.listener.type=batch
@@ -70,7 +70,7 @@ spring.kafka.consumer.properties.session.timeout.ms=45000
spring.kafka.consumer.fetch-min-size= 1048576 spring.kafka.consumer.fetch-min-size= 1048576
spring.kafka.listener.ack-mode= manual spring.kafka.listener.ack-mode= manual
spring.kafka.listener.concurrency= 2 spring.kafka.listener.concurrency=2
spring.kafka.listener.type=batch spring.kafka.listener.type=batch
@@ -72,7 +72,7 @@ spring.kafka.consumer.properties.session.timeout.ms=45000
#spring.kafka.consumer.value-deserializer: org.apache.kafka.common.serialization.StringDeserializer #spring.kafka.consumer.value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.fetch-min-size= 1048576 spring.kafka.consumer.fetch-min-size= 1048576
spring.kafka.listener.ack-mode= manual spring.kafka.listener.ack-mode= manual
spring.kafka.listener.concurrency= 2 spring.kafka.listener.concurrency=2
spring.kafka.listener.type=batch spring.kafka.listener.type=batch
# 定时任务配置 # 定时任务配置
@@ -69,7 +69,7 @@ spring.kafka.consumer.properties.session.timeout.ms=45000
spring.kafka.consumer.properties.partition.assignment.strategy=org.apache.kafka.clients.consumer.RoundRobinAssignor spring.kafka.consumer.properties.partition.assignment.strategy=org.apache.kafka.clients.consumer.RoundRobinAssignor
spring.kafka.consumer.fetch-min-size= 1048576 spring.kafka.consumer.fetch-min-size= 1048576
spring.kafka.listener.ack-mode= manual spring.kafka.listener.ack-mode= manual
spring.kafka.listener.concurrency= 2 spring.kafka.listener.concurrency=2
spring.kafka.listener.type=batch spring.kafka.listener.type=batch
@@ -96,7 +96,7 @@ spring.kafka.consumer.properties.session.timeout.ms=45000
spring.kafka.consumer.fetch-min-size= 1048576 spring.kafka.consumer.fetch-min-size= 1048576
spring.kafka.listener.ack-mode= manual spring.kafka.listener.ack-mode= manual
spring.kafka.listener.concurrency= 2 spring.kafka.listener.concurrency=2
spring.kafka.listener.type=batch spring.kafka.listener.type=batch
@@ -117,8 +117,7 @@ public class SysLogProcessor {
"${syslog.reliability.retry-10m-topic:${spring.kafka.consumer.topic}.RETRY.10M}", "${syslog.reliability.retry-10m-topic:${spring.kafka.consumer.topic}.RETRY.10M}",
"${syslog.reliability.retry-1h-topic:${spring.kafka.consumer.topic}.RETRY.1H}", "${syslog.reliability.retry-1h-topic:${spring.kafka.consumer.topic}.RETRY.1H}",
"${syslog.reliability.replay-topic:${spring.kafka.consumer.topic}.REPLAY}" "${syslog.reliability.replay-topic:${spring.kafka.consumer.topic}.REPLAY}"
}, }
concurrency = "${spring.kafka.listener.concurrency}" // 单体部署时仍由配置控制并发度
) )
public void consumeAndParallelProcess(List<ConsumerRecord<String, String>> records, Acknowledgment ack) { public void consumeAndParallelProcess(List<ConsumerRecord<String, String>> records, Acknowledgment ack) {
// [流程节点4] 批量 poll 后按记录顺序处理,避免后面的成功记录越过前面的失败记录推进 offset。 // [流程节点4] 批量 poll 后按记录顺序处理,避免后面的成功记录越过前面的失败记录推进 offset。
@@ -67,7 +67,7 @@ spring.kafka.consumer.properties.session.timeout.ms=45000
#spring.kafka.consumer.value-deserializer: org.apache.kafka.common.serialization.StringDeserializer #spring.kafka.consumer.value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.fetch-min-size= 1048576 spring.kafka.consumer.fetch-min-size= 1048576
spring.kafka.listener.ack-mode= manual spring.kafka.listener.ack-mode= manual
spring.kafka.listener.concurrency= 2 spring.kafka.listener.concurrency=2
spring.kafka.listener.type=batch spring.kafka.listener.type=batch
# 定时任务配置 # 定时任务配置
@@ -70,7 +70,7 @@ spring.kafka.consumer.properties.session.timeout.ms=45000
spring.kafka.consumer.fetch-min-size= 1048576 spring.kafka.consumer.fetch-min-size= 1048576
spring.kafka.listener.ack-mode= manual spring.kafka.listener.ack-mode= manual
spring.kafka.listener.concurrency= 2 spring.kafka.listener.concurrency=2
spring.kafka.listener.type=batch spring.kafka.listener.type=batch
@@ -73,7 +73,7 @@ spring.kafka.consumer.properties.session.timeout.ms=45000
#spring.kafka.consumer.value-deserializer: org.apache.kafka.common.serialization.StringDeserializer #spring.kafka.consumer.value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.fetch-min-size= 1048576 spring.kafka.consumer.fetch-min-size= 1048576
spring.kafka.listener.ack-mode= manual spring.kafka.listener.ack-mode= manual
spring.kafka.listener.concurrency= 2 spring.kafka.listener.concurrency=2
spring.kafka.listener.type=batch spring.kafka.listener.type=batch
# 定时任务配置 # 定时任务配置
@@ -78,7 +78,7 @@ spring.kafka.consumer.properties.session.timeout.ms=45000
spring.kafka.consumer.fetch-min-size= 1048576 spring.kafka.consumer.fetch-min-size= 1048576
spring.kafka.listener.ack-mode= manual spring.kafka.listener.ack-mode= manual
spring.kafka.listener.concurrency= 2 spring.kafka.listener.concurrency=2
spring.kafka.listener.type=batch spring.kafka.listener.type=batch
@@ -98,7 +98,7 @@ spring.kafka.consumer.properties.session.timeout.ms=45000
spring.kafka.consumer.fetch-min-size= 1048576 spring.kafka.consumer.fetch-min-size= 1048576
spring.kafka.listener.ack-mode= manual spring.kafka.listener.ack-mode= manual
spring.kafka.listener.concurrency= 2 spring.kafka.listener.concurrency=2
spring.kafka.listener.type=batch spring.kafka.listener.type=batch
@@ -23,6 +23,7 @@ class SyslogKafkaTopologyTest {
assertEquals("syslog-consumer-raw", listener.id()); assertEquals("syslog-consumer-raw", listener.id());
assertEquals("${spring.kafka.consumer.group-id}", listener.groupId()); assertEquals("${spring.kafka.consumer.group-id}", listener.groupId());
assertEquals("${syslog.raw-consumer.enabled:true}", listener.autoStartup()); assertEquals("${syslog.raw-consumer.enabled:true}", listener.autoStartup());
assertEquals("${spring.kafka.listener.concurrency}", listener.concurrency()); // 并发度交给容器工厂的类型化配置处理,禁止在注解中直接 parseInt 原始字符串。
assertEquals("", listener.concurrency());
} }
} }