zoukankan      html  css  js  c++  java
  • Kafka批量消费问题:A parameter of type 'List<ConsumerRecord>' must be the only parameter

    使用kafka单笔消费时,listener函数写成如下方式是可以正常执行的

    @KafkaListener(topics = "dealmsg", id = "dealmsggroup")
    public String ReciveMsg(ConsumerRecord<?, ?> record, KafkaConsumer<?,?> consumer)

    当改为批量消费时,listener函数写成如下方式会报错:A parameter of type 'List<ConsumerRecord>' must be the only parameter

    @KafkaListener(topics = "dealmsg", id = "dealmsggroup")
    public String ReciveMsg(List<ConsumerRecord<?, ?>> records, KafkaConsumer<?,?> consumer)

    报错截图

    先说解决方案,把KafkaConsumer<?,?> consumer参数改成Consumer<?,?> consumer就可以了。

    @KafkaListener(topics = "dealmsg", id = "dealmsggroup")
    public String ReciveMsg(List<ConsumerRecord<?, ?>> records, Consumer<?,?> consumer)

    分析过程如下:

    在哪报的错,就去哪里看看代码,找到org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.determineInferredType(MessagingMessageListenerAdapter.java:593)这一行,如下图所示,分析代码对于输入参数为ConsumerRecords或List<ConsumerRecord>或List<Message<?>>,有效的参数个数不能小于输入参数个数。输入的参数为2,推导出的允许参数只有1,所以报错了。

    再分析整个determineInferredType函数,该函数根据输入的参数来推断类型,判断输入的每个参数的类型,是否允许的类型,即ConsumerRecord、或List<ConsumerRecord>、或Acknowledgment、或Consumer等,而KafkaConsumer不是有效类型。

  • 相关阅读:
    Jedis 源代码阅读一 —— Jedis
    Java中的${pageContext.request.contextPath}
    VMware Workstation 12 安装mac os x 10.11
    机器学习——朴素贝叶斯分类器
    Codeforces 138C(区间更新+离散化)
    Threejs 官网
    深刻理解Nginx之Nginx完整安装
    Apache + Tomcat 负载均衡 session复制
    小P寻宝记——好基友一起走
    C++数值类型极限值的获取
  • 原文地址:https://www.cnblogs.com/zhaoshizi/p/12355270.html
Copyright © 2011-2022 走看看