如何利用producer向Kafka发送信息(基于java客户端(Kafka-clients))

继上一篇Kafka安装以及环境准备文章后,这一小节是讲解如何利用Java客户端kafka-clients库进行消息的发送。

工程结构(maven工程)

maven依赖

        <!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>2.2.0</version>
        </dependency>

producer代码

public class MyProducer {

    public static void main(String[] args) {
        Properties kafkaProperties = new Properties();
        kafkaProperties.put("bootstrap.servers", "192.168.8.135:9092");
        kafkaProperties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        kafkaProperties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        KafkaProducer producer = new KafkaProducer(kafkaProperties);
        ProducerRecord record = new ProducerRecord("test", "name", "water");
        try {
            Future result = producer.send(record);
            System.out.println(result.get());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

代码解析:

  1. 主要是两个对象:producer和record,record组装想要发送的数据,然后通过producer进行发送。
  2. bootstrap.servers是表示Kafka服务器broker的地址,一般建议提供至少两个broker的地址信息,通过逗号分隔,一旦其中一个死机了,生产者仍然能连接到集群上,我这里的本地环境是单机,所以只填写了一个地址
  3. key.serializer是表示消息中的键的序列化器,网络传输需要进行序列化成字节数组
  4. value.serializer是表示消息中值的序列化器

可能出现的错误

  1. java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Topic test not present in metadata after 60000 ms. 造成该错误的原因有可能是防火墙问题,请把虚拟机的防火墙关闭就ok
  2. org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for test-0: 30534 ms has passed since batch creation plus linger time 这种错误一开始让我百思不得其解,明明Kafka服务器broker的地址没有问题,为什么就是发送数据失败呢?最后通过debug发现了获取到的cluster的地址居然是bogon:9092(下面的图一),这个bogon是什么东西,为什么不是我在代码中的IP地址呢?个人推测是不是host name的问题,于是在kafka中的server.properties添加了图二中的host.name配置,重启Kafka就OK了



简单的producer发送消息的例子到此结束,大部分时间都花在了解决异常问题上,不过收获不少。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值