我已经制作了一个监听器,它以字符串作为键,以通用的Avro-class V作为消息来监听Kafka主题,如下所示。这样可以很好地工作,并在消息发送到主题时触发MessageListener。
String topic = "foo-topic" //from constructor arguments.
ConsumerFactory<String, V> consumerFactory = new DefaultKafkaConsumerFactory<>(
consumerConfig(), getKeyDeserializer(), getValueDeserializer() //methods I've defined.
);
ConcurrentMessageListenerContainer<String, V> container = new ConcurrentMessageListenerContainer<>(
consumerFactory, new ContainerProperties(topic)
);
container.setupMessageListener((MessageListener<String, V>) record -> {
// Do stuff...
});
container.start();
现在,提一个问题。我需要实现某种形式的健康检查方法,以检查与Kafka的连接。如何为ConcurrentMessageListenerContainer执行此操作?如果无法连接到Kafka,是否可以使用一种失败的方法?我正在研究通用的帮助程序类,并希望通过一些常规方法定期检查与Kafka的连接。
编辑: 经过一些试验,我想出了这种方法。如果找到主题,则返回true;如果无法连接到Kafka,则抛出异常。这是一件好事吗,我想念的是什么?
private boolean checkHealth() throws InterruptedException, ExecutionException, TimeoutException {
Properties props = new Properties();
props.setProperty(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP);
try (AdminClient admin = AdminClient.create(props)) {
return admin.listTopics().names().get(10, TimeUnit.SECONDS).stream().anyMatch(t -> t.equals(topic));
}
}