我有一个基于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”但没有快乐。
答案 0 :(得分:2)
这只是我的一个想法。 我们不能使用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?
当一个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)
} `
答案 1 :(得分:0)
所以问题可以使用Scala的Future monad来解决你需要做的是改变那些processLogger方法返回Future [Int]现在你不应该使用Future的onSuccess和onFailure方法,因为它们已经被弃用了所以你可以通过在此Future上添加回调来确保它。
使用onComplete
或map
或foreach
result.onComplete{
case Success(x) => println(x)
case Failure(ex)=>ex.printStackTrace}