利用Kafka生产消费消息实例

本文详细介绍了Kafka生产者的配置方法,包括依赖配置、消息序列化及发送流程,并通过具体代码示例展示了如何初始化生产者、设置参数如bootstrap.servers、acks等。同时,针对发送消息时出现的超时异常等问题进行了分析与讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 配置相关依赖

在这里插入图片描述

ps: 注意artifactId配置项中,kafka_后跟的版本号必须与本机装的kafka对应的scala的版本一致

  1. 编码

生产者
该段代码学习
下篇博客中的代码,但本文中init方法是根据官方文档写的
https://blog.csdn.net/konglongaa/article/details/81208946

import org.apache.kafka.clients.producer.*;
import java.util.Properties;
import java.util.concurrent.Executors;

public class Producer1 {
    private Producer<String,String> producer;

    public static void main(String[] args){
        new Producer1().start();
    }
    public void init(){
        Properties kafkaProps = new Properties();    //创建一个生产者
        kafkaProps.put("bootstrap.servers","192.168.235.128:9092");

        //消息序列化,将键和值定义成字符串类,将value和key都序列化为字节数组
        kafkaProps.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
        kafkaProps.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer");
       //acks=all是最安全的模式
        kafkaProps.put("acks","all");

        //该配置负责producer发送消息后是否等待broker的ack,默认是0不等待
        //kafkaProps.put("request.required.acks","2");

        producer = new KafkaProducer<String,String>(kafkaProps);
    }
    public void produceMsg(){
        long timestamp = System.currentTimeMillis();
        String msg = "Msseage" + timestamp;
        String topic = "kafka_test";
        System.out.println("发送消息" + msg);
        String key = "Msseage-Key" + timestamp;

        ProducerRecord<String,String> data = new ProducerRecord<>(topic,key,msg);
        try{
            producer.send(data).get();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public void start(){
        System.out.println("开始发送新消息:");
        Executors.newSingleThreadExecutor().execute(new Runnable() {
            @Override
            public void run() {
                init();
                while(true){
                    try{
                        produceMsg();
                        Thread.sleep(3000);
                    }catch (Throwable e){
                        if(producer != null){
                            try{
                                producer.close();
                            }catch (Throwable e1){
                                System.out.println("Turn off kafka producer error!" );
                            }
                        }
                    }
                }
            }
        });
    }
}

上段代码执行后,每次发送消息后,都会报如下错误(待解决),

发送消息Msseage1567755952639
java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for kafka_test-0:120000 ms has passed since batch creation
	at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.valueOrError(FutureRecordMetadata.java:98)
	at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.java:67)
	at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.java:30)
	at Producer1.produceMsg(Producer1.java:45)
	at Producer1$1.run(Producer1.java:59)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for kafka_test-0:120000 ms has passed since batch creation
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值