如果我不关闭kafka制作人会发生什么

时间:2017-03-27 21:48:32

标签: java apache-kafka kafka-producer-api

我正在处理xml,我需要每条记录发送一条消息,当我收到最后一条记录时我关闭了kafka生产者,这里的问题是kafka生产者的send方法是异步的,因此,有时当我关闭它所生产的生产者java.lang.IllegalStateException: Cannot send after the producer is closed.我在某个地方徘徊,我可以让生产者打开。我的问题是¿它意味着什么?或者如果有更好的解决方案

--- ---编辑

<list>
  <element attr1="" att2="" attr3=""/>
  <element attr1="" att2="" attr3=""/>
  <element attr1="" att2="" attr3=""/>
  <element attr1="" att2="" attr3=""/>
  <element attr1="" att2="" attr3=""/>
  <element attr1="" att2="" attr3=""/>
  <element attr1="" att2="" attr3=""/>
  <element attr1="" att2="" attr3=""/>
...
</list>

想象一下以下场景:

  • 我们阅读了标签,并创建了kafka制作人
  • 我们读取每个元素的属性,生成一个json对象并使用send方法将其发送到kafka。 - 当我们读取元素时,我们在生产者中调用close方法

问题元素的数量因此可以是80k,有时当我们调用disconnect方法时,它会继续以异步方式发送消息。所以我们需要先调用flush方法,但它会影响性能

谢谢

1 个答案:

答案 0 :(得分:2)

在致电Producer.flush()之前,您应致电Producer.close()。这是一个阻止调用,并且不会在所有记录发送之前返回。

如果您不打电话给close(),根据实施/语言,您最终可能会遇到资源/内存泄漏。