#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}")
.