繁体   English   中英

是否可以分别使用来自 kafka 主题的每条消息?

[英]Is it posible to consume each message from a kafka topic separately?

好的,目标是:我有一个应该发送邮件的服务,如果失败,我的 Kafka 生产者会将此邮件发送到 Kafka 主题。 第二个程序每两分钟查看一次主题,并且应该只使用一条消息(最旧的一条)并重试发送它,如果失败,程序应该将此消息带回主题。

我已经有一个消费者,但问题是,它消费了我到现在为止没有消费的所有消息。 但我希望他只吃最老的,他以前没有吃过。

这是我的实际消费者:

“customMessage”是我为测试创建的 class,它只是一个 object,具有不同的属性,如日期、消息和其他内容。 为了测试代码有点修改,所以这个消费者正在运行。 它也只显示消息而不是处理它,所以只有“ System.out.println(message.displayMessage()); “。

公共 class ConsumerOne {

public static void main(String[] args) {

    Properties properties = new Properties();
    properties.put("bootstrap.servers", "localhost:9092");
    properties.put("group.id", "happyConsumer");
    properties.put("auto.offset.reset", "earliest");
    properties.put("enable.auto.commit", "false");
    properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

    KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(properties);

    consumer.subscribe(Arrays.asList("mymailtopic"));

    while (true) {
        ObjectMapper om = new ObjectMapper();
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
        for (ConsumerRecord<String, String> record : records) {
            customMessage message=null;
            try {
                 message = om.readValue(record.value(), customMessage.class);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            System.out.println(message.displayMessage());
        }
    }


}

}

使用实际代码,该服务也可以工作,但我至少可以尝试它是否也可以像我在第一段中提到的那样工作。 所以,我的问题是:

  1. 是否甚至可以只使用来自该主题的一条消息?
  2. 如果是,我该怎么做?

我在整个服务中使用 Java 和 quarkus(我认为是最新版本的 Kafka)。

您可以使用max.poll.records属性逐条消息消费,在配置中将此属性设置为1

在一次 poll() 调用中返回的最大记录数。

properties.put("max.poll.records", 1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM