Scala:如何捕获通过Kafka异步发送的所有多条消息的状态?

时间:2019-04-05 21:30:29

标签: scala callback apache-kafka kafka-producer-api

我正在使用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循环结束后如何跟踪这些状态,并据此采取进一步的措施?

1 个答案:

答案 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

或者您可以尝试通过在循环内进行检查来尽早失败,但这将是异步的,可能效果不佳