scala.sys.process.ProcessBuilderでタイムアウトさせる
MBAで実行しているときは一度も起きなかったんだけど、メイン機(Win/Linux両方)でscala.sys.process.ProcessBuilderからmecabを実行すると、ときたま帰ってこなかったりする。大量に処理しようとするとこれでは困るので、タイムアウトとリトライ処理を実装してみた。
タイムアウト時間はscala.concurrent.duration.FiniteDurationを利用して指定する。また、Futureを利用するので、globalをimportするか、適切なExecutionContextを作成する必要がある。
@tailrec def retry(pb: ProcessBuilder, count: Int = 0)(implicit timeout: FiniteDuration): String = { lazy val out = new StringBuilder val p = pb.run(ProcessLogger(x => out.append(x), System.err.print)) try { Await.result(Future.apply(blocking(p.exitValue)), timeout) out.toString } catch { case e: TimeoutException => p.destroy() if (count > 0) retry(pb, count - 1) else throw e } }
タイムアウト時間はscala.concurrent.duration.FiniteDurationを利用して指定する。また、Futureを利用するので、globalをimportするか、適切なExecutionContextを作成する必要がある。
コメント
0 件のコメント :
コメントを投稿