Java 发送到主题时引发的TimeoutException

Java 发送到主题时引发的TimeoutException,java,spring-boot,apache-kafka,spring-restcontroller,spring-kafka,Java,Spring Boot,Apache Kafka,Spring Restcontroller,Spring Kafka,我已经使用KafkaTemplateBean创建了sender类来将负载发送到主题 使用SenderConfiguration类中的某些配置 发送方类 @Component public class Sender { private static final Logger LOGGER = (Logger) LoggerFactory.getLogger(Sender.class); @Autowired private KafkaTemplate<String

我已经使用KafkaTemplateBean创建了sender类来将负载发送到主题 使用SenderConfiguration类中的某些配置

发送方

@Component
public class Sender {
    private static final Logger LOGGER = (Logger)  LoggerFactory.getLogger(Sender.class);

    @Autowired
    private KafkaTemplate<String, String>   kafkaTemplate;

    public void send(String topic, String payload) {
        LOGGER.info("sending payload='{}' to topic='{}'", payload, topic);

        kafkaTemplate.send(topic, "1", payload);
    }
}
简单地说,控制器包含

@RestController
public class Controller {
    protected final static String HELLOWORLD_TOPIC = "helloworld.t";

    @Autowired
    private Sender sender;

    @RequestMapping("/send")
    public String SendMessage() {

        sender.send(HELLOWORLD_TOPIC, "message");

        return "success";
    }
}
例外是

2017-12-20 09:58:04.645  INFO 10816 --- [nio-7060-exec-1] o.a.kafka.common.utils.AppInfoParser     : Kafka version : 0.10.1.1
2017-12-20 09:58:04.645  INFO 10816 --- [nio-7060-exec-1] o.a.kafka.common.utils.AppInfoParser     : Kafka commitId : f10ef2720b03b247
2017-12-20 09:59:04.654 ERROR 10816 --- [nio-7060-exec-1] o.s.k.support.LoggingProducerListener    : Exception thrown when sending a      message with key='1' and payload='message' to topic helloworld.t:

org.apache.kafka.common.errors.TimeoutException: Failed to update   metadata after 60000 ms.

使用包含键的方法

kafkaTemplate.send(topic, key, payload);

不清楚您想要使用什么键值,但它应该均匀地分布在主题的分区计数中。例如,分区计数范围内的随机数

这意味着你的经纪人没有在运作。
检查server.log并在必要时重新启动代理

此类错误的可能性很小

  • 无法使用配置的端口访问Kafka代理。
    • 为此,如果您得到的输出意味着kafka borker正在运行,请尝试使用telnet localhost 9092进行telnet
  • 检查spring boot使用的kafka客户端版本是否与您的kafka版本相同。如果版本不匹配,卡夫卡可能无法向主题发送数据

  • 有时,经纪人需要时间来了解新创建的主题。因此,生产者可能会失败,错误为
    在60000毫秒后更新元数据失败。
    要绕过此问题,请使用kafka命令行选项手动创建kafka

  • server.properties的侦听器配置不工作

  • 你也可以试试这个

    • 将“bootstrap.servers”属性或--broker list选项更改为0.0.0.0:9092

    • 在2个属性中更改server.properties

      • listeners=PLAINTEXT://your.host.name:9092 to listeners=PLAINTEXT://:9092
      • 播发的.listeners=PLAINTEXT://your.host.name:9092到播发的.listeners=PLAINTEXT://localhost:9092

    希望有帮助

    你需要看看生产工厂的内部结构。。。或者有一个包含键的send方法,不仅仅是主题和值。例如,我找到了KEY\u SERIALIZER\u CLASS\u CONFIG和KEY\u SERIALIZER\u CLASS\u DOC。但是它们和异常之间没有关系,因为我认为
    ProducerConfig
    是错误的类,在60000毫秒后,
    未能更新元数据。
    -通常只是意味着代理没有运行。它仍然抛出除了密钥之外,还有相同的异常。向主题helloworld发送密钥为='1'且有效负载为='HHSHS'的消息时引发异常。t:那么,异常与密钥无关,但这是您提出的问题。显示stacktrace的其余部分
    2017-12-20 09:58:04.645  INFO 10816 --- [nio-7060-exec-1] o.a.kafka.common.utils.AppInfoParser     : Kafka version : 0.10.1.1
    2017-12-20 09:58:04.645  INFO 10816 --- [nio-7060-exec-1] o.a.kafka.common.utils.AppInfoParser     : Kafka commitId : f10ef2720b03b247
    2017-12-20 09:59:04.654 ERROR 10816 --- [nio-7060-exec-1] o.s.k.support.LoggingProducerListener    : Exception thrown when sending a      message with key='1' and payload='message' to topic helloworld.t:
    
    org.apache.kafka.common.errors.TimeoutException: Failed to update   metadata after 60000 ms.
    
    kafkaTemplate.send(topic, key, payload);