【问题标题】:Why does the AdminClient not throw an exception?为什么 AdminClient 不抛出异常?
【发布时间】:2019-07-11 22:29:58
【问题描述】:

我有一个 Kafka AdminClient,当 Kafkaserver 处于活动状态时,它将返回 true,否则返回 false。

  private def health(server: String): Boolean = {
    val props = new Properties
    props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, server)
    props.put(AdminClientConfig.CONNECTIONS_MAX_IDLE_MS_CONFIG, "10000")
    props.put(AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG, "5000")

    try {
      AdminClient
        .create(props)
        .listTopics()
        .names()
        .get()
      true
    } catch {
      case _: InterruptedException => false
      case _: ExecutionException => false
    }

现在,我有一个场景,Kafka 处于离线状态,并且该方法既不返回 false 也不返回 true。

我做错了什么?

【问题讨论】:

    标签: scala apache-kafka


    【解决方案1】:

    应用评论,我似乎无法复制问题,例如,以下

      val kafkaFuture = new KafkaFutureImpl
      kafkaFuture.completeExceptionally(new RuntimeException("splosh"))
      println(
        try {
          kafkaFuture.get()
        } catch {
          case _: InterruptedException => "boom"
          case _: ExecutionException => "crash"
        }
      )
    

    输出crash,表示case _: ExecutionException 分支被正确命中。

    【讨论】:

    • 方法names() 返回一个Future 但get() 等待结果准备好。
    • 方法get 不返回未来,它返回结果。这里是get方法的描述Waits if necessary for this future to complete, and then returns its result.我不明白,你想说什么。
    • kafkaFuture.get() 应该模拟....names().get() 发生的情况,因为names() 返回KafkaFuture。所以我要说的是,如果在调用get 时抛出异常,那么try-catch 应该可以正常工作,因为它将是ExecutionException。你确定AdminClient 是在抛出异常吗?
    • 但是为什么我没有得到结果,调用get时还是出现异常。
    【解决方案2】:
    import scala.util.Try
    
    private def health(server: String): Boolean = {
      val props = new Properties
      props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, server)
      props.put(AdminClientConfig.CONNECTIONS_MAX_IDLE_MS_CONFIG, "10000")
      props.put(AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG, "5000")
    
      Try (
        AdminClient
          .create(props)
          .listTopics()
          .names()
          .get()
      ).isSuccess
    }
    

    发生这种情况的原因是抛出了另一个异常。

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2014-07-09
      • 2017-07-03
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      相关资源
      最近更新 更多