我有一个带有单个分区的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,两者给出的结果相同。
答案 0 :(得分:0)
如Javadoc中所述,这是因为endOffset - 1
返回:
最后成功复制的邮件的偏移量加上一个
这实际上是下一条消息将获得的偏移量。
这就是为什么寻求endOffset - 2
不返回任何内容而寻求SSESpecification:
SSEEnabled: True
仅返回最后一条消息的原因。
我同意这可能不是最直观的行为,但这是目前的工作方式!