我是akka流的新手。我正在使用kafka作为源(使用ReactiveKafka库)并通过流进行一些数据处理并使用订户(EsHandler)作为接收器。
现在我需要处理错误并通过错误处理程序将其推送到不同的kafka队列。我正在尝试将EsHandler用作发布者和订阅者。我不确定如何将EsHandler作为中间人而非沉沦。
这是我的代码:
val publisher = Kafka.kafka.consume(topic, "es", new StringDecoder())
val flow = Flow[String].map { elem => JsonConverter.convert(elem.toString()) }
val sink = Sink.actorSubscriber[GenModel](Props(classOf[EsHandler]))
Source(publisher).via(flow).to(sink).run()
class EsHandler extends ActorSubscriber with ActorPublisher[Model] {
val requestStrategy = WatermarkRequestStrategy(100)
def receive = {
case OnNext(msg: Model) =>
context.actorOf(Props(classOf[EsStorage], self)) ! msg
case OnError(err: Exception) =>
context.stop(self)
case OnComplete =>
context.stop(self)
case Response(msg) =>
if (msg.isError()) onNext(msg.getContent())
}
}
class ErrorHandler extends ActorSubscriber {
val requestStrategy = WatermarkRequestStrategy(100)
def receive = {
case OnNext(msg: Model) =>
println(msg)
}
}
答案 0 :(得分:3)
我们强烈建议反对实施您自己的处理器(这是reactive streams规范为“订阅者和发布者”提供的名称。很难做到正确,这就是为什么没有Publisher直接暴露为辅助特征。
相反,大多数情况下,您需要使用提供给您的Sources
/ Sinks
(或Publishers
/ Subscribers
)并在这些之间运行您的操作,作为地图/过滤器等步骤。
事实上,您可以使用Kafka Sources和Sinks的现有实现,它被称为reactive-kafka,并由Reactive Streams TCK验证,因此您可以相信它是有效的实现。