java作为kafka生产者实验及Expiring超时问题解决

【README】 java作为生产者,centos 作为消费者;

【1】生产者代码 

-- pom.xml 
<!-- 依赖 --> 
  <dependencies>
  	<dependency>
  		<groupId>org.apache.kafka</groupId>
  		<artifactId>kafka-clients</artifactId>
  		<version>0.11.0.0</version>
  	</dependency>
  </dependencies>

生产者

-- 生产者 
public class MyProducer {
	public static void main(String[] args) {
		/* 1.创建kafka生产者的配置信息 */
		Properties props = new Properties();
		/*2.指定连接的kafka集群, broker-list */
		props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "centos201:9092");  
		/*3.ack应答级别*/
		props.put(ProducerConfig.ACKS_CONFIG, "all");
		/*4.重试次数*/
		props.put(ProducerConfig.RETRIES_CONFIG, 3); 
		/*5.批次大小,一次发送多少数据,当数据大于16k,生产者会发送数据到 kafka集群 */
		props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16 * KfkNumConst._1K);  
		/*6.等待时间, 等待时间超过1毫秒,即便数据没有大于16k, 也会写数据到kafka集群 */
		props.put(ProducerConfig.LINGER_MS_CONFIG, 1); 
		/*7. RecordAccumulator 缓冲区大小*/ 
		props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 32 * KfkNumConst._1M);  
		/*8. key, value 的序列化类 */ 
		props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
		props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
		
		System.out.println(props); 
		/* 9.创建生产者对象 */
		KafkaProducer<String, String> producer = new KafkaProducer<>(props);  
		/* 10.发送数据 */ 
		for (int i = 0; i < 10; i++) { 
			Future<RecordMetadata> future = producer.send(new ProducerRecord<>("first01", "first01-20201229--A" + i));
			System.out.printf("写入数据%s \n", "first01-20201229--A" + i);
			try {
				System.out.println(future.get().offset());
			} catch (Exception e) {
				e.printStackTrace();
			} 
		}
		/* 11.关闭资源 */  
		producer.close();
		System.out.println("kafka生产者写入数据完成"); 
	} 
}

【2】centos 消费者 

[root@centos202 kafka-0.11]# kafka-console-consumer.sh --topic first01 --bootstrap-server centos201:9092 --from-beginning
first01-20201229--2
first01-20201229--6
first01-20201229--A0
first01-20201229--A1
first01-20201229--A2
first01-20201229--A3
first01-20201229--A4
first01-20201229--A5
first01-20201229--A6
first01-20201229--A7
first01-20201229--A8
first01-20201229--A9

【3】生产者发送消息超时问题

3.1、问题现场

kafka Expiring 1 record(s) for first01-3: 31539 ms has passed since batch creation plus linger time

3.2、解决方法

修改本地机器的hosts, 如下:

192.168.163.201 centos201 
192.168.163.202 centos202 
192.168.163.203 centos203 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验环境: - Kafka版本:2.12-2.0.0 - JDK版本:1.8.0_211 - IDE版本:IntelliJ IDEA 2020.1.2 实验过程: 1. 创建一个Kafka主题 首先,我们需要创建一个Kafka主题来存储我们的消息。我们可以使用Kafka自带的命令行工具kafka-topics.sh来创建主题。执行以下命令: ``` ./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test ``` 这个命令将在本地Kafka服务器上创建一个名为“test”的主题,它只有一个分区和一个副本分区。 2. 编写生产者代码 在Java中,我们可以使用Kafka提供的KafkaProducer类来创建一个生产者。以下是一个简单的生产者实现: ```java import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord; import java.util.Properties; public class ProducerExample { public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); // Kafka服务器地址和端口号 props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // 消息键序列化类 props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // 消息值序列化类 KafkaProducer<String, String> producer = new KafkaProducer<>(props); // 创建一个Kafka生产者 String topic = "test"; // Kafka主题名称 String message = "Hello, Kafka!"; // 消息内容 ProducerRecord<String, String> record = new ProducerRecord<>(topic, message); // 创建一个生产者记录 producer.send(record); // 发送消息 producer.close(); // 关闭生产者 } } ``` 这个实现非常简单,它创建了一个KafkaProducer对象,设置了Kafka服务器地址和端口号、消息键序列化类和消息值序列化类。然后,它创建了一个ProducerRecord对象,该对象包含了要发送的消息的主题和内容,并将该对象发送到Kafka服务器。 3. 运行生产者代码 我们可以使用以下命令编译和运行上面的代码: ``` javac ProducerExample.java java ProducerExample ``` 如果一切正常,那么你应该会在Kafka服务器的日志中看到以下输出: ``` [2019-07-12 13:44:07,634] INFO [Producer clientId=producer-1] Sending record {test=Hello, Kafka!} with callback org.apache.kafka.clients.producer.internals.RecordBatch$1@6a5fc7e (org.apache.kafka.clients.producer.internals.Sender) ``` 这表明消息已成功发送到Kafka服务器。 实验总结: 在本次实验中,我们学习了如何在Java中使用KafkaProducer类来实现Kafka生产者。我们创建了一个Kafka主题,并使用KafkaProducer类发送消息到该主题。这个实现非常简单,只需要几行Java代码就可以完成。在实际应用中,我们可能需要使用更复杂的实现来处理更多的业务逻辑和异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值