【问题标题】:Catching Scala Process failures捕获 Scala 进程失败
【发布时间】:2018-04-08 04:54:43
【问题描述】:

我有一个基于 Scala 的 RESTful API。其中一条路由调用外部命令并使用 ProcessLogger 捕获输出。当我在服务器上放置少量负载(通过单元测试)时,外部命令调用开始间歇性地失败。没有响应返回,HTTP 请求超时。没有填充 Process 调用的返回码,没有抛出异常......我无法在日志中捕获或找到任何内容。 有没有一种特定的方法可以捕获 scala 中的所有 Process 调用问题,这可能有助于我调试正在发生的事情?

我的代码看起来像这样...

try { 
  var resultCode:Int = 
    (Seq("echo",data) #| 
      Seq("external-command-to-call")) !
      ProcessLogger(stdout append _, stderr append _)

  println("Output "+resultCode)
  println(stderr)
  println(stdout)

  // check return code
  if(resultCode > 0) {
    Left("An error occurred")
  }
} catch {
   case e: Exception => {
     Left("An exception occurred")
   }
}

10 次中有 9 次它会打印“输出”,但间歇性地它会在外部调用中死掉,从不打印“输出”。 “左”也没有被触发。 我尝试使用 Try/Success/Failure 并捕获“Throwable”,但没有任何乐趣。

【问题讨论】:

    标签: scala exception-handling


    【解决方案1】:

    这只是我的一个想法。 我们不能使用 Scala Futures 来解决这个问题吗:) 我希望您可以使用 Future onFailure 来处理这种情况。 我在 StackOverflow 中找到了关于 Scala Process Logger 的类似文章,希望这对您有所帮助。 Scala ProcessLogger & Future: How can I make sure all line callbacks are called BEFORE the onComplete block?

    斯卡拉未来[T]

    当一个 Future 以一个值完成时,它是一个成功的完成。 如果 Future 完成时出现异常,则表示失败。 https://docs.scala-lang.org/overviews/core/futures.html

    `val f: Future[List[String]] = Future {
      session.getRecentPosts
    }
    
    f onFailure {
      case t => println("An error has occured: " + t.getMessage)
    }
    
    f onSuccess {
      case posts => for (post <- posts) println(post)
    } `
    

    【讨论】:

      【解决方案2】:

      所以问题可以使用 Scala 的 Future monad 来解决,您需要做的是更改这些 processLogger 方法以返回 Future[Int] 现在您不应该使用 Future 的 onSuccess 和 onFailure 方法,因为它们已被弃用,所以您可以通过在这个 Future 上添加回调来确保它。 通过使用onCompletemapforeach

      result.onComplete{
      case Success(x) => println(x)
      
      case Failure(ex)=>ex.printStackTrace}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        • 2014-01-24
        • 2016-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多