我正在使用Scala将消息发布到Kafka。 我有可能要异步发布的消息列表。但是,最后,如果发布至少一封邮件时出现任何错误,我必须捕获并采取措施。 我知道回调方法,但是每条消息只能使用一种。我想积累或弄清所有这些状态的方式,并确定是否一切正常。类似于批处理状态。
for (message <- messageList) {
// Create a message
// producer is created
// I have a separate util package, having the MyCallback class with overridden onCompletion method.
producer.send(new ProducerRecord[String, MyMessage](config("topic"), message ), new MyCallback(config))
}
// here, I need help, to see if any of the messages sent is failed or not.
// How to capture the statuses of callback here for entire batch?
// Separate class file
class MyCallback (config: Map[String, String]) extends Callback {
override def onCompletion(metadata: RecordMetadata, exception: Exception): Unit = {
// if successful meta data, do something
// if exception, I can log the error.
}
}
基本上,我可以在回调类方法中检查单个消息的状态。
在for循环结束后如何跟踪这些状态,并据此采取进一步的措施?
答案 0 :(得分:0)
如果将new MyCallback(config)
移至for循环之前,则可能会有所帮助。
然后,您有一个实例可以将异常收集到其中。
再加上回调对象将在循环之后进入作用域,您可以检索状态列表
我的scala有点生锈,但我认为它表明了这个主意
class MyCallback (config: Map[String, String]) extends Callback {
private val exceptions = _ // some mutable List
def getExceptions() { return exceptions }
override def onCompletion(metadata: RecordMetadata, exception: Exception): Unit = {
if (exception != null) {
exceptions.add(exception)
}
}
}
然后
val cb = new MyCallback(config)
for (message <- messageList) {
producer.send(new ProducerRecord[String, MyMessage](config("topic"), message ), cb)
}
// TODO: check cb.getExceptions().size > 0
或者您可以尝试通过在循环内进行检查来尽早失败,但这将是异步的,可能效果不佳