Quarkus Apache Kafka:无法禁用指定消息连接器的健康检查
解决SmallRye Kafka连接器消息处理错误导致健康状态DOWN的问题
问题分析
你配置的health-readiness-enabled、health-liveness-enabled等参数仅控制Kafka连接器本身的连接健康检查,但当前健康状态DOWN是因为消息处理方法(ActionDlqConnector#onMessage)中的异常被Reactive Messaging的全局健康检查捕获,这类异常属于消息处理逻辑的失败,不属于连接器连接层面的问题,所以原有配置无法覆盖。
解决方案
方法一:使用@HealthIgnore注解排除特定方法的健康追踪
直接在消息处理方法上添加@HealthIgnore注解,让SmallRye Reactive Messaging忽略该方法的失败对健康状态的影响:
import io.smallrye.reactive.messaging.health.HealthIgnore; @NonBlocking @ActivateRequestContext @Incoming("actions-dlq-in") @Retry(maxRetries = 1, jitter = 1000L, delay = 2000L) @Acknowledgment(Acknowledgment.Strategy.PRE_PROCESSING) @HealthIgnore // 添加该注解排除健康检查追踪 public Uni<Void> onMessage(ConsumerRecord<String, ActionKafkaDTO> rejected) { log.info(String.format("Received dlq action: %s %s %s", rejected.topic(), rejected.partition(), rejected.offset())); return sessionFactory.withTransaction(session -> { log.info(String.format("Re-processing action: %s", rejected.value())); return service.processAction(rejected.value(), kafkaMessageTime(rejected), session) .onFailure() .invoke(e -> log.log(Level.SEVERE, "Error saving action from dlq", e)); }); }
方法二:通过配置排除特定通道的健康检查
如果不想修改代码,可以在application.yml中添加配置,指定忽略该通道的健康检查:
mp: messaging: incoming: actions-dlq-in: topic: mytopic connector: smallrye-kafka failure-strategy: ignore consumer-rebalance-listener: name: consumer-seek.rebalancer health-readiness-enabled: false health-liveness-enabled: false health-enabled: false # 添加以下配置忽略该通道的健康追踪 smallrye.health.ignore: true
若需要忽略多个通道,也可以使用全局配置:
smallrye: messaging: health: ignore: actions-dlq-in
验证
修改后重启应用,访问http://localhost:8080/q/health,此时该消息处理方法的异常将不再影响应用的健康状态,健康检查会返回UP。
内容的提问来源于stack exchange,提问作者GFerruzzi
相关产品推荐
相关产品推荐

