使用密钥=' 1'发送邮件时抛出异常和有效负载='消息'主题为helloworld.t

时间:2017-12-20 07:34:56

标签: java spring-boot apache-kafka spring-restcontroller spring-kafka

我使用kafkatemplate bean发送了一个发送者类来向主题发送有效负载 使用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);
    }
}

senderConfiguration

@Configuration
public class SenderConfig {

    @Value("${kafka.bootstrap-servers}")
    private String bootstrapServers;

    @Bean
    public Map<String, Object> producerConfigs() {
        Map<String, Object> props = new HashMap<>();
        // list of host:port pairs used for establishing the initial connections to the Kakfa cluster
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);

        return props;
    }

    @Bean
    public ProducerFactory<String, String> producerFactory() {
        return new DefaultKafkaProducerFactory<>(producerConfigs());
    }

    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
        return new KafkaTemplate<>(producerFactory());
    }

    @Bean
    public Sender sender() {
        return new Sender();
    }
}

问题在于发送不产生

这里是application.yml文件属性

kafka:
   bootstrap-servers: localhost:9092
topic:
   helloworld: helloworld.t

只是包含

的控制器
@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.

3 个答案:

答案 0 :(得分:0)

使用包含密钥的方法

kafkaTemplate.send(topic, key, payload);

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

答案 1 :(得分:0)

这意味着您的经纪人不在运行。 检查server.log并在必要时重新启动代理

答案 2 :(得分:0)

这种错误的可能性很小。

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

  3. 有时,代理需要一些时间来了解新创建的主题。因此,生产者可能会失败,并显示错误Failed to update metadata after 60000 ms.。要解决此问题,请使用kafka命令行选项手动创建kafka。

  4. server.properties的侦听器配置不起作用。

您也可以尝试

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

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

    • listeners = PLAINTEXT://your.host.name:9092 to listeners = PLAINTEXT://:9092
    • advertised.listeners = PLAINTEXT://您的主机名:9092到advertised.listeners = PLAINTEXT:// localhost:9092

希望有帮助!