Alpakka kafka使用者处理记录,直到遇到无法反序列化且静默死而没有留下错误消息的记录。如何强制其报告错误消息?
答案 0 :(得分:0)
当流失败时,库内部将处理所有基础 资源。
(反序列化)
如果从卡夫卡读取失败是由其他原因引起的 原因,例如反序列化问题,那么该阶段将失败 立即。如果您预计会发生这种情况,请考虑消耗原始字节 数组和反序列化在随后的地图阶段中可以使用 监督以跳过失败的元素。
建议使用字节数组将消息反序列化(反序列化) 值,并在Akka Stream中的地图操作中进行(反序列化),而不是直接在Kafka(反)序列化器中实现。
带有Spray JSON的示例(此示例使用恢复来处理无法正确解析的数据并忽略错误的元素):
import spray.json._
final case class SampleData(name: String, value: Int)
object SampleDataSprayProtocol extends DefaultJsonProtocol {
implicit val sampleDataProtocol: RootJsonFormat[SampleData] = jsonFormat2(SampleData)
}
import SampleDataSprayProtocol._
val resumeOnParsingException = ActorAttributes.withSupervisionStrategy {
new akka.japi.function.Function[Throwable, Supervision.Directive] {
override def apply(t: Throwable): Supervision.Directive = t match {
case _: spray.json.JsonParser.ParsingException => Supervision.Resume
case _ => Supervision.stop
}
}
}
val consumer = Consumer
.plainSource(consumerSettings, Subscriptions.topics(topic))
.map { consumerRecord =>
val value = consumerRecord.value()
val sampleData = value.parseJson.convertTo[SampleData]
sampleData
}
.withAttributes(resumeOnParsingException)
.toMat(Sink.seq)(Keep.both)
.mapMaterializedValue(DrainingControl.apply)
.run()