强制Alpakka Kafka使用者在反序列化错误上显示错误消息

时间:2019-06-14 16:32:56

标签: scala apache-kafka kafka-consumer-api alpakka

Alpakka kafka使用者处理记录,直到遇到无法反序列化且静默死而没有留下错误消息的记录。如何强制其报告错误消息?

1 个答案:

答案 0 :(得分:0)

根据documentation

  

当流失败时,库内部将处理所有基础   资源。

     

(反序列化)

     

如果从卡夫卡读取失败是由其他原因引起的   原因,例如反序列化问题,那么该阶段将失败   立即。如果您预计会发生这种情况,请考虑消耗原始字节   数组和反序列化在随后的地图阶段中可以使用   监督以跳过失败的元素。

建议使用字节数组将消息反序列化(反序列化) 值,并在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()