我的使用者配置如下:
public static Consumer<String, TransactionDataAvro> createConsumer() {
Properties props = new Properties();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS);
props.put(ConsumerConfig.GROUP_ID_CONFIG, "KafkaExampleAvroConsumer");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, KafkaAvroDeserializer.class.getName());
props.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, "true");
props.put(KafkaAvroDeserializerConfig.SCHEMA_REGISTRY_URL_CONFIG, "http://localhost:8000");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
return new KafkaConsumer<>(props);
}
他订阅了主题
this.consumer.subscribe(Collections.singletonList("fss-fsstransdata"));
每次我尝试获取消息(this.consumer.poll(Duration.ofMillis(500))
)时,它只会稳定返回第二个方法调用
代码
log.info("COUNT:" + this.consumer.poll(Duration.ofMillis(1000)).count());
log.info("COUNT:" + this.consumer.poll(Duration.ofMillis(1000)).count());
log.info("COUNT:" + this.consumer.poll(Duration.ofMillis(1000)).count());
log.info("COUNT:" + this.consumer.poll(Duration.ofMillis(1000)).count());
log.info("COUNT:" + this.consumer.poll(Duration.ofMillis(1000)).count());
日志:
| 17:47:40.688 | main | INFO | IaStepsDefinitions | COUNT:0
| 17:47:40.689 | main | INFO | IaStepsDefinitions | COUNT:1
| 17:47:41.690 | main | INFO | IaStepsDefinitions | COUNT:0
| 17:47:42.691 | main | INFO | IaStepsDefinitions | COUNT:0
| 17:47:43.692 | main | INFO | IaStepsDefinitions | COUNT:0
请向我解释为什么
答案 0 :(得分:2)
Consumer.poll()
除了实际轮询数据外,实际上还有很多其他事情。
所有这些步骤都受传递给方法 poll()的 Duration 对象的约束, 如果持续时间= 1ms,您会发现事情会变得更糟。
在我看来,将此逻辑放入poll()方法,让民意测验执行民意测验,在后台线程中执行其余操作和/或订阅方法都是误导和错误的。
进行轮询时,您不希望系统执行以下操作:
if (!updateAssignmentMetadataIfNeeded(timer)) {
return ConsumerRecords.empty();
}
民意调查是面向客户的逻辑,如果它获得0条记录,则应表示 经纪人为空。
如果您呼叫 REST 服务并清空响应,则说明服务器已清空。 如果调用PreparedStatement.execute(),则会得到正确的结果或异常。 如果调用RabbitMQ.basicGet(),则会收到一个空响应,这意味着队列为空。
长话短说,就您而言,只需增加第一次民意调查的超时时间,您就应该立即获得更新。