簡體   English   中英

Spring 引導 Kafka Consumer 未消費,Kafka Listener 未觸發

[英]Spring Boot Kafka Consumer not consuming, Kafka Listener not triggering

我正在嘗試構建一個簡單的 spring 引導 Kafka Consumer 以使用來自 kafka 主題的消息,但是由於 KafkaListener 方法沒有被觸發,因此沒有消息被消耗。

我在其他答案中看到,以確保 AUTO_OFFSET_RESET_CONFIG 設置為“最早”並且 GROUP_ID_CONFIG 是唯一的,我這樣做了,但是 KafkaListenerMethod 仍然沒有觸發。 該應用程序只是啟動並且不執行任何操作:

Application Started

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.4.RELEASE)

這是另一個 gradle 項目的子項目,該子項目的 build.gradle 如下(代碼中已正確提供了 MAIN_CLASS_PATH):

apply plugin: 'application'

mainClassName = <MAIN_CLASS_PATH>

dependencies {
    compile "org.springframework.kafka:spring-kafka:${SpringKafkaVersion}"
    compile "org.springframework.boot:spring-boot-starter:${SpringBootVersion}"
    compile group: 'org.springframework', name: 'spring-tx', version: '5.2.2.RELEASE'
}

Java 類:

開始.java:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Start {
    public static void main(String[] args) {
        try {
            System.out.println("Application Started");
            SpringApplication.run(Start.class, args);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

KafkaConsumerConfig.java:

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;

import java.util.HashMap;
import java.util.UUID;

@EnableKafka
@Configuration
public class KafkaConsumerConfig {

    @Bean
    public ConsumerFactory<String, String> consumerFactory() {
        HashMap<String, Object> props = new HashMap<>();
        props.put(
                ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
                <KAFKA_SERVER_ADDRESS>);
        props.put(
                ConsumerConfig.GROUP_ID_CONFIG,
                UUID.randomUUID().toString());
        props.put(
                ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
                StringDeserializer.class);
        props.put(
                ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
                StringDeserializer.class);
        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        return new DefaultKafkaConsumerFactory<>(props);
    }

    @Bean
    public ConcurrentKafkaListenerContainerFactory<String, String>
    kafkaListenerContainerFactory() {

        ConcurrentKafkaListenerContainerFactory<String, String> factory =
                new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory());
        return factory;
    }

KafkaConsumer.java

@Service
public class KafkaConsumer {

    @KafkaListener(topics = <TOPIC_NAME>)
    public void consume(@Payload ConsumerRecord<String, String> message) {
        System.out.println("Consumed message: " + message);
    }
}

KAFKA_SERVER_ADDRESS 和 TOPIC_NAME 已在我的代碼中正確提供。 我還檢查了該主題實際上是否已經包含消息。

關於為什么這不會消耗來自 kafka 主題的任何消息的任何想法?

Spring boot 和 spring kafka 具有自動配置功能。 對於簡單的消費者,刪除您的配置類,並將此屬性添加到您的 application.yml(或 .properties):

 spring.application.name: your-app-name
 spring.kafka.consumer.group-id: your-group-id
 spring.kafka.bootstrap-servers: server1:port1,server2:port2,server3:port3

問題是 kafka 連接問題。 從 kafka 服務器消費的機器不允許從 kafka 服務器消費。 將 kafka 服務器節點中的消費機器列入白名單解決了這個問題。

如果 kafka 服務器 url 可以解析但由於權限不足而無法連接,則 kafka 消費者不會記錄。 這不是 spring kafka 特有的,但即使是普通的 kafka 客戶消費者也沒有記錄這一點。

在您的偵聽器中添加組-id。 @KafkaListener(topics = "<topic-name", groupId = ""。您還必須在 Consumer 屬性中加載它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM