我有以下代码:
__kafka_client = KafkaProducer(value_serializer=lambda m: json.dumps(m).encode('ascii'))
for(msg in messages):
__kafka_client.send('TOPIC', dumps(msg)).add_callback(on_kafka_send_success).add_errback(on_kafka_send_error)
def on_kafka_send_success(record_metadata):
print(record_metadata.topic)
def on_kafka_send_error(excp):
kafa_error_message = "Error while sending kafka message :"+str(excp);
raise Exception(excp)
` 循环结束时出现以下错误:
Error while sending kafka message :IllegalStateError: Producer is closed forcefully.
NoneType: None
如何避免/解决此问题?
答案 0 :(得分:1)
这个问题在我直接调用生产/发送方法后关闭客户端进程时重现。显然,在解释器运行send()调用之前,不一定要刷新消息缓冲区。 就像Bhuneshwer的答案(https://stackoverflow.com/a/51940821/12912120)中一样, 您可以使用flush()以便在终止进程之前刷新消息缓冲区,或者如果您不立即结束进程,消息将尽快发送(此“很快”可以由queue.buffering配置。最高毫秒)。
请注意,flush()会阻塞直到缓冲区刷新完成,因此在每个生产调用之后使用刷新等效于实现同步流,并且可能会影响性能。
请参阅合流卡夫卡伙计们提供的以下答案以获取更多信息: https://github.com/confluentinc/confluent-kafka-python/issues/137#issuecomment-282427382
答案 1 :(得分:0)
已解决
__kafka_client = KafkaProducer(value_serializer=lambda m: json.dumps(m).encode('ascii'))
for(msg in messages):
__kafka_client.send('TOPIC', dumps(msg)).add_callback(on_kafka_send_success).add_errback(on_kafka_send_error)
__kafka_clinet.flush()