![](/img/trans.png)
[英]Kafka-python Producer performs Send, but no data arrives in Kafka
[英]Kafka-python producer.send isn't being recieved in a try-except block, but does send with time.sleep(1)
我正在測試一個腳本,該腳本在文件上運行 binwalk,然后發送一條 kafka 消息,讓發送文件知道它已完成或失敗。 它看起來像這樣:
if __name__ == "__main__":
# finds the path of this file
scriptpath = os.path.dirname(inspect.getfile(inspect.currentframe()))
print(scriptpath)
# sets up kafka consumer on the binwalk topic and kafka producer for the bwsignature topic
consumer = KafkaConsumer('binwalk', bootstrap_servers=['localhost:9092'])
producer = KafkaProducer(bootstrap_servers = ['localhost:9092'])
# watches the binwalk kafka topic
for msg in consumer:
# load the json
job = json.loads(msg.value)
# get the filepath of the .bin
filepath = job["src"]
print(0)
try:
# runs the script
binwalkthedog(filepath, scriptpath)
# send a receipt
producer.send('bwsignature', b'accepted')
except:
producer.send('bwsignature', b'failed')
pass
producer.close()
consumer.close()
如果我發送的文件在“binwalkthedog”function 中沒有給出任何錯誤,那么它工作正常,但如果我給它一個不存在的文件,它會打印一條一般錯誤消息並繼續下一個輸入,正如它應該。 出於某種原因, producer.send('bwsignature', b'failed') 不會發送,除非在 binwalkthedog 調用失敗后出現延遲,例如 time.sleep(1) 或計數為一百萬的 for 循環.
顯然我可以保留它,但它真的很惡心,我相信有更好的方法來做到這一點。
這是我用來發送和接收來自 binwalkthedog 模塊的信號的臨時腳本:
job = {
'src' : '/home/nick/Documents/summer-2021-intern-project/BinwalkModule/bo.bin',
'id' : 1
}
chomp = json.dumps(job).encode('ascii')
receipt = KafkaConsumer('bwsignature', bootstrap_servers=['localhost:9092'])
producer = KafkaProducer(bootstrap_servers = ['localhost:9092'])
future = producer.send('binwalk', chomp)
try:
record_metadata = future.get(timeout=10)
except KafkaError:
print("sucks")
pass
print(record_metadata.topic)
print(record_metadata.partition)
print(record_metadata.offset)
producer.close()
for msg in receipt:
print(msg.value)
break
Kafka 生產者將許多記錄批處理在一起,以減少對服務器的請求。 如果你想強制發送記錄,而不是引入阻塞睡眠調用,或者在未來調用get
,你應該使用producer.flush()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.