SpringKafka消费者-从复杂对象获取主题

atmip9wb  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(394)

我正在开发一个SpringBootKafka消费者应用程序。它将有不同的消费者在不同的主题上工作。消费者的所有信息都来自application.yml文件。

  1. application:
  2. kafka:
  3. consumer-config:
  4. - name: consumer-a
  5. topics: topic1,topic2
  6. ......
  7. - name: consumer-b
  8. topics: topic3,topic4
  9. .....

我无法将应用程序属性中的主题列表设置为kafkalistener。
我尝试了以下方法:

  1. @KafkaListener(topics = "#{'${application.kafka.consumer-config[0].topics}'.split(',')}",containerFactory = "kafkaListenerContainerFactory")
  2. @KafkaListener(topics = "#{'${application.kafka.consumer-config.?[name == 'consumer-a'].topics}'.split(',')}", containerFactory = "kafkaListenerContainerFactory")

在这两种情况下,我得到以下错误:
java.lang.illegalargumentexception:无法解析占位符
从应用程序属性获取主题并将其设置为kafkalistener主题的最佳方法是什么?

sqyvllje

sqyvllje1#

你用的是什么版本?我刚测试过,效果很好。。。

  1. @SpringBootApplication
  2. public class So63583349Application {
  3. public static void main(String[] args) {
  4. SpringApplication.run(So63583349Application.class, args);
  5. }
  6. @KafkaListener(topics = "#{'${application.kafka.consumer-config[0].topics}'.split(',')}", id = "so63583349")
  7. public void listen(String in) {
  8. System.out.println(in);
  9. }
  10. }

2020-08-25 13:02:28.384 warn 66237---[o63583349-0-c-1]org.apache.kafka.clients.networkclient:[consumer clientid=consumer-so63583349-1,groupid=so63583349]获取相关id为41的元数据时出错:{topic1=unknown\u topic\u或\u partition,topic2=unknown\u topic\u或\u partition}
对于第二个,不能在属性占位符中使用spel选择。对于这种情况,有一种解决办法:

  1. @SpringBootApplication
  2. public class So63583349Application {
  3. public static void main(String[] args) {
  4. SpringApplication.run(So63583349Application.class, args);
  5. }
  6. @KafkaListener(topics = "#{@props.consumerConfig.?[name == 'consumer-a'].get(0).topics.split(',')}",
  7. id = "so63583349")
  8. public void listen(String in) {
  9. System.out.println(in);
  10. }
  11. @Bean
  12. Props props() {
  13. return new Props();
  14. }
  15. }
  16. @ConfigurationProperties(value = "application.kafka")
  17. class Props {
  18. List<Properties> consumerConfig;
  19. public List<Properties> getConsumerConfig() {
  20. return this.consumerConfig;
  21. }
  22. public void setConsumerConfig(List<Properties> consumerConfig) {
  23. this.consumerConfig = consumerConfig;
  24. }
  25. }
展开查看全部

相关问题