Kafka上一条消息民意调查结果为0条消息

时间:2019-01-09 10:06:38

标签: apache-kafka kafka-consumer-api

我有一个带有单个分区的Kafka主题(1.0.0)。使用者打包在EAR内,当部署到Wildfly 10时,对最后一条消息的轮询始终返回0条消息。尽管主题不为空。

final TopicPartition tp = new TopicPartition(topic, 0);

final Long beginningOffset = consumer.beginningOffsets(Collections.singleton(tp)).get(tp);
final Long endOffset = consumer.endOffsets(Collections.singleton(tp)).get(tp);

consumer.assign(Collections.singleton(tp));
consumer.seek(tp, endOffset - 1); 

进行民意测验时,我得到0条记录。尽管日志记录状态:

Consumer is now at position 377408 while Topic begin is 0 and end is 377409

当我改为-2时:

consumer.seek(tp, endOffset - 2);

我确实收到一条消息:

 Consumer is now at position 377407 while Topic begin is 0 and end is 377409

但是当然这不是正确的记录,消息377408在哪里?

尝试了多种方法来寻求结局等,但它永远行不通。

这是我的使用者配置:

Properties properties = new Properties();
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, Configuration.KAFKA_SERVERS.getAsString());
properties.put(ConsumerConfig.GROUP_ID_CONFIG, GROUP_ID);
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class);
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");
properties.put(ConsumerConfig.ISOLATION_LEVEL_CONFIG, "read_committed");

注意:我尝试使用read_uncommitted和read_committed,两者给出的结果相同。

1 个答案:

答案 0 :(得分:0)

Javadoc中所述,这是因为endOffset - 1返回:

  

最后成功复制的邮件的偏移量加上一个

这实际上是下一条消息将获得的偏移量。

这就是为什么寻求endOffset - 2不返回任何内容而寻求SSESpecification: SSEEnabled: True 仅返回最后一条消息的原因。

我同意这可能不是最直观的行为,但这是目前的工作方式!