Весна-Кафка: Как передать тему кафки из приложения.yml

#spring #apache-kafka #spring-kafka

Вопрос:

У меня есть небольшой проект в весенней Кафке, я хотел бы передать свою тему кафки из приложения.yml и избегайте проблем с жестким кодированием. На данный момент у меня такая ситуация:

 
public class KafkaConsumer {
    @Autowired
    private UserRepository userRepository;


    @KafkaListener(topics = "myTopic")
    public void listen(@Validate UserDto userDto) {

        User user= new User(userDto);
        userRepository.save(userDto.getAge(), user);
    }
}
 

в данный момент у меня есть статическая тема кафки (будучи строкой), можно ли поместить ее в приложение.yml и прочитал ли он оттуда? Спасибо всем за любую помощь

Ответ №1:

Вы можете опубликовать свою тему в приложении.yml :

 kafka:
  template:
    default-topic: "MyTopic"
 

В твоем кафкалистернере :

 @KafkaListener(topics = "#{'${spring.kafka.template.default-topic}'}")
 

Таким образом, вы должны решить проблему, связанную с тем, что «Значение атрибута» не принимает динамическое значение

Это сработало для меня.

Комментарии:

1. Вам не нужен SpEL для простого заполнителя — @KafkaListener(topics = "${spring.kafka.template.default-topic}") будет работать.

Ответ №2:

Вы можете использовать нижеприведенную запись в приложении.файл yml

введите описание изображения здесь

Обычно мы используем @Value, как показано ниже, для выбора данных из файлов свойств/yaml для указанного ключа в вашем классе Java, как показано ниже.

 @Value("${kafka.topic.name}")
private String TOPIC_NAME;
 

Поскольку слушатель Кафки ожидает здесь константы, вы можете использовать непосредственно, как показано ниже

 public class KafkaConsumer {

@Autowired
private UserRepository userRepository;


@KafkaListener(topics = "${kafka.topic.name}")
public void listen(@Validate UserDto userDto) {

    User user= new User(userDto);
    userRepository.save(userDto.getAge(), user);
}
 

}

Комментарии:

1. Спасибо за ответ, я пытался использовать его, но когда я пытаюсь поместить KafkaListerner, он говорит мне: «Значение атрибута должно быть постоянным», есть ли что-нибудь еще, что я должен добавить?

2. Просто используйте заполнитель напрямую @KafkaListener(topics = "${kafka.topic.name}") .