2017-04-10 33 views
0

Kafka API 0.10.1:LinkKafkaProducer onCompletion()回调是否总是在同一个线程中执行?

有没有保证onCompletion回调在同一个线程中被顺序调用?该文档说“请注意,回调通常会在生产者的I/O线程中执行”。所以我会认为不。

如果我想跟踪保持一个整数计数器发生的异常数量,是否需要使用AtomicInteger?

或者,如果我想保留一个布尔标志来跟踪是否在最后一次回调中发生异常,我是否需要使其变为volatile?

回答

0

有没有保证onCompletion回调在同一个线程中被顺序调用?该文档说“请注意,回调通常会在生产者的I/O线程中执行”。所以我会认为不。

总体上没有。例如,默认情况下,并行请求中有多个请求 - 它也取决于您的重试次数(默认值不是重试次数)。

如果我想跟踪,例如,通过保持一个整数计数器发生的异常的数量,我是否需要使用AtomicInteger?

只有一个线程写入。所以严格没有。阅读线程可能会“错过”更新,但稍后您将阅读此更新。

或者如果我想保留一个布尔标志来跟踪是否在上次回调中发生异常,我是否需要使其变为volatile?

可能会有帮助。

此外:您可以在回调的主线程中“阻止并等待”。

有关详细信息,请参阅 http://docs.confluent.io/current/clients/producer.html#synchronous-writes

+0

所以你说什么是我应该删除回调,而是做的Future.get()? – rents

+0

如果你想获得同步处理,是的。它当然会带来性能上的冲击。 –

+0

对,这应该是一个评论,没有答案。我没有寻找替代方案,只是想检查是否应该保持变量的原子性/易失性。 – rents

相关问题