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