【exception】Java和kafka連接正常但是發送數據失敗

描述

今天Java程序和kafka整合的時候遇到一個情況,Java可以和kafka連接但是在發送數據的時候出現了以下的異常:

-2019-07-30 14:55:08.494 -ERROR 2191 [kafka-producer-network-thread | producer-1] (LoggingProducerListener.java:84) Exception thrown when sending a message with key='null' and payload='[{"index_level":"1","unit":"%","id...' to topic testData:
-
org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for testData-0: 30032 ms has passed since batch creation plus linger time

看到連接超時一開始以爲是連接的問題,但是連接是正常的,在尋找資料後,找到了一個解決這個問題的方法。

解決

啓動zookeeper的客戶工具,刪除zookeeper根目錄下的brokers目錄下的topic目錄下的所有東西(這樣會把之前建的所有topic都刪除)

具體步驟:

  1. 啓動zookeeper 客戶端:進到zookeeper的安裝目錄
[root@Node1 bin]# cd /usr/apps/zookeeper/bin/
[root@Node1 bin]# ls
README.txt  zkCleanup.sh  zkCli.cmd  zkCli.sh  zkEnv.cmd  zkEnv.sh  zkServer.cmd  zkServer.sh  zookeeper.out
  1. 運行zkCli.sh
[root@Node1 bin]# ./zkCli.sh 
Connecting to localhost:2181
  1. 查看/brokers/topic下面有什麼東西
[zk: localhost:2181(CONNECTED) 0] ls /brokers/topics
  1. 刪除裏面所有的文件
[zk: localhost:2181(CONNECTED) 0]rmr /brokers/topics/hive-test-table
  1. 重新啓動producer和consumer,Java重新發送就可以看發過來的數據

原因分析

具體原因不清楚。

但是這個超時是因爲producer.properties配置文件有一個值是request.timeout.ms,默認是30秒。producer往broker發送數據時是串行的,只有上次batch全部寫入broker,並且全部callback函數執行完畢後,纔會繼續下一次發送。如果上一次發送全部callback函數執行時間超過了30秒,就會導致後續batch的message發送時間大於創建時間30秒以上,然後被producer丟棄並拋出異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章