当服务器或端口细节错误时,kafka使用者会无限期等待

时间:2018-02-14 12:38:15

标签: apache-kafka kafka-consumer-api

我已经设置了具有以下属性的kafka消费者

    Properties consumerProperties = new Properties();
    consumerProperties.put("bootstrap.servers",server);
    consumerProperties.put("group.id",groupId);
    consumerProperties.put("security.protocol", "SASL_PLAINTEXT");
    consumerProperties.put("sasl.mechanism", "PLAIN");
    consumerProperties.put("enable.auto.commit", "false");
    consumerProperties.put("acks", "all");
    consumerProperties.put("request.timeout.ms", 12000);
    consumerProperties.put("max.block.ms",500);
    consumerProperties.put("session.timeout.ms", 11000);
    consumerProperties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    consumerProperties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
 //Object creation from above properties
 KafkaConsumer<String, String> consumer = new KafkaConsumer<>(consumerProperties);
 // i have try catch blocks but exceptions aren't being thrown.

如果服务器详细信息不正确,则在轮询期间进入infinte等待 - 例如服务器名称错误或端口不正确

            try{
                LOGGER.info("Subscribing to topic.");
                consumer.subscribe(Arrays.asList(topic));
                LOGGER.info("Subscribed to topic successfully.");
                LOGGER.info("Start of polling records for consumer. ");
                ***records = consumer.poll(100);***
         //CODE GETS STUCK IN ABOVE LINE FOR INFINITE TIME AND DOESNT COMES OUT
                LOGGER.info("Returning records to microservice.");
            }
            catch(InterruptException interruptException) {
                LOGGER.error("interrupt exception "+interruptException);
            }
            catch(TimeoutException timeoutException) {
                LOGGER.error("Time out exception "+timeoutException);
            }
            catch (KafkaException kafkaException) {
                LOGGER.error("Kafka Exception occurred while consuming records by consumer. Message: "+kafkaException.getMessage());
            }
            catch(Exception exception){
                LOGGER.error("Exception occured while creating consumer object "+exception);
            }

请提出我需要做些什么更改才能中断轮询不正确服务器的无限等待?

4 个答案:

答案 0 :(得分:2)

正如其他人所指出的那样,Kafka的内部ConsumerCoordinator目前有一个内置超时9223372036854775807ms,同时试图确保协调员准备就绪。

如果您只是想在尝试轮询消费者之前确保您的主机/端口信息正确,则只需调用consumer.listTopics()即可。如果它无法连接,它将抛出org.apache.kafka.common.errors.TimeoutException

答案 1 :(得分:1)

我认为除了外部检查您的第一次轮询运行多长时间以及在一段时间后中断它之外,您目前还没有太多可以做的事情。执行此操作的最佳方法可能是使用像讨论in this SO answer一样的ExecutorService。

Kafka jira周围有几张门票可供您观看周围的任何开发(KAFKA-1894KAFKA-2391KAFKA-3834)但是没有太多最近对这个话题的积极讨论。

答案 2 :(得分:1)

这是一个已知问题。请参阅JIRA问题:https://issues.apache.org/jira/browse/KAFKA-3834

摆脱无限循环的唯一方法是从另一个线程调用wakeup()

答案 3 :(得分:0)

重新启动Zookeeper和kafka都对我有用。