Vertx Kafka客户端使用者示例无法正常工作且未显示任何错误

时间:2018-01-09 12:11:36

标签: kafka-consumer-api vert.x

有没有人设法让这个例子有效? http://vertx.io/docs/vertx-kafka-client/java/

我尝试连接到正在运行的Kafka和Vertx-kafka-client 3.5.0,但没有成功。 更奇怪的是,运行这个小代码片段,但根本没有任何kafka集群,消费者表示它已成功订阅。

public class KafkaConsumerExampleVerticle extends AbstractVerticle {

    public static void main(String[] args) throws Exception {
        KafkaConsumerExampleVerticle verticle = new KafkaConsumerExampleVerticle();
        Vertx.vertx().deployVerticle(verticle);
    }

    @Override
    public void start() throws Exception {

        KafkaConsumer<String, String> consumer = createKafkaConsumer();

        consumer.handler(m -> {
            System.out.println("Consumer | message received: " + m);
        });

        consumer.subscribe("topic1", h -> {
            if (h.succeeded()) {
                System.out.println("Consumer subscribed!");
            } else if (h.failed()){
                System.out.println("Consumer failed: " + h.cause());                
            }
        });

    }

    private KafkaConsumer<String, String> createKafkaConsumer() {
        Map<String, String> config = new HashMap<>();
        config.put("bootstrap.servers", "192.68.99.100:9092");
        config.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        config.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        config.put("group.id", "my_group");
        config.put("auto.offset.reset", "earliest");
        config.put("enable.auto.commit", "false");
        KafkaConsumer<String, String> consumer = KafkaConsumer.create(vertx, config);
        return consumer;
    }

}

无论我放在哪个IP或者我是否运行任何kafka集群都没关系,Consumer订阅成功。 这是预期的行为吗?如果设置成功,怎么会知道设置有什么问题?

1 个答案:

答案 0 :(得分:0)

您看到的行为是我们所期望的,因为底层使用的“原生”Kafka客户端的行为如何。 consumer.subscribe方法调用“本机”客户端提供的基础“订阅”方法,该方法不启动任何连接,因此与代理进行任何通信(它只是在本地保存有关订阅的信息)。 只有在调用本机“poll”方法时,“本机”Kafka客户端才会启动与代理的所有连接(因此在这种情况下发送订阅请求)。 此时会出现另一个问题:如果指定的代理无法访问,实际上“本机”轮询方法会挂起。真的它没有挂起但它开始发送一个“查找协调器”请求等待响应。默认“request.timeout.ms”为305000(约5分钟),直到它认为请求失败。即使您将此值设置为较低的值,请求也会失败,但稍后会检测到连接失败。