Apache Kafka:KafkaProducerActor抛出异常ASk超时。

时间:2017-02-12 14:12:52

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

我正在使用蛋糕解决方案Akka client for scala and Kafka。当我创建一个KafkaProducerActor actor并尝试使用ask模式发送消息并返回future并执行某些操作时,但每次,我都面临ask超时异常。以下是我的代码:

class SimpleAkkaProducer (config: Config, system: ActorSystem) {

  private val producerConf = KafkaProducer.
    Conf(config,
      keySerializer = new StringSerializer,
      valueSerializer = new StringSerializer)

  val actorRef = system.actorOf(KafkaProducerActor.props(producerConf))

  def sendMessageWayOne(record: ProducerRecords[String, String]) = {
    actorRef ! record
  }

  def sendMessageWayTwo(record: ProducerRecords[String, String]) = {
    implicit val timeout = Timeout(100.seconds)
    val future = (actorRef ? record).mapTo[String]
    future onComplete  {
      case Success(data) => println(s" >>>>>>>>>>>> ${data}")
      case Failure(ex) => ex.printStackTrace()
    }
  }
}

object SimpleAkkaProducer {
  def main(args: Array[String]): Unit = {
    val system = ActorSystem("KafkaProducerActor")
    val config = ConfigFactory.defaultApplication()
    val simpleAkkaProducer = new SimpleAkkaProducer(config, system)

    val topic = config.getString("akka.topic")
    val messageOne = ProducerRecords.fromKeyValues[String, String](topic,
      Seq((Some("Topics"), "First Message")), None, None)

    simpleAkkaProducer.sendMessageWayOne(messageOne)
    simpleAkkaProducer.sendMessageWayTwo(messageOne)
  }
}

以下是例外:

akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://KafkaProducerActor/user/$a#-1520717141]] after [100000 ms]. Sender[null] sent message of type "cakesolutions.kafka.akka.ProducerRecords".
    at akka.pattern.PromiseActorRef$.$anonfun$apply$1(AskSupport.scala:604)
    at akka.actor.Scheduler$$anon$4.run(Scheduler.scala:126)
    at scala.concurrent.Future$InternalCallbackExecutor$.unbatchedExecute(Future.scala:864)
    at scala.concurrent.BatchingExecutor.execute(BatchingExecutor.scala:109)
    at scala.concurrent.BatchingExecutor.execute$(BatchingExecutor.scala:103)
    at scala.concurrent.Future$InternalCallbackExecutor$.execute(Future.scala:862)
    at akka.actor.LightArrayRevolverScheduler$TaskHolder.executeTask(LightArrayRevolverScheduler.scala:329)
    at akka.actor.LightArrayRevolverScheduler$$anon$4.executeBucket$1(LightArrayRevolverScheduler.scala:280)
    at akka.actor.LightArrayRevolverScheduler$$anon$4.nextTick(LightArrayRevolverScheduler.scala:284)
    at akka.actor.LightArrayRevolverScheduler$$anon$4.run(LightArrayRevolverScheduler.scala:236)
    at java.lang.Thread.run(Thread.java:745)

1 个答案:

答案 0 :(得分:2)

如果您将successResponse中的failureResponseProducerRecords值指定为None以外的其他值,则生产者角色仅响应发件人。当Kafka写入成功时,successResponse值将发送回发送方,并且当Kafka写入失败时,将发送failureResponse值。

示例:

val record = ProducerRecords.fromKeyValues[String, String](
  topic = topic,
  keyValues = Seq((Some("Topics"), "First Message")),
  successResponse = Some("success"),
  failureResponse = Some("failure")
)

val future = (actorRef ? record).mapTo[String]
future onComplete  {
  case Success("success") => println("Send succeeded!")
  case Success("failure") => println("Send failed!")
  case Success(data) => println(s"Send result: $data")
  case Failure(ex) => ex.printStackTrace()
}