簡體   English   中英

Kafka-python producer.send 未在 try-except 塊中收到,但確實與 time.sleep(1) 一起發送

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM