Scala Lift - запустить системную команду и дождаться завершения - PullRequest
1 голос
/ 12 декабря 2011

Я сейчас использую класс, найденный здесь:

http://www.qualitybrain.com/?p=84

Все работает хорошо, однако мне нужен код, чтобы дождаться завершения команды и затем вернуть ответ типа true / false, чтобы я мог затем продолжить с результатом.

Я использую его вместе с OpenOffice для преобразования некоторых документов, поэтому крайне важно дождаться завершения преобразования документов, прежде чем использовать полученные файлы.

Спасибо за любую помощь, высоко ценится:)

1 Ответ

1 голос
/ 12 декабря 2011
  1. Код должен уже дождаться завершения команды, поскольку receiveWithin является методом блокировки.Вы можете проверить это самостоятельно, просто выполнив пример функции main с sleep 10 и println до и после.
  2. Получение результата boolean из функции запуска должно быть довольно простым, вам просто нужно внести небольшое изменение в функцию запуска.

Новая run функция:

def run(command:String) : Boolean = {
    println("gonna runa a command: " + Thread.currentThread)
    val args = command.split(" ")
    val processBuilder = new ProcessBuilder(args: _* )
    processBuilder.redirectErrorStream(true)
    val proc = processBuilder.start()

    //Send the proc to the actor, to extract the console output.
    reader ! proc

    //Receive the console output from the actor.
    //+========== Begin Modified Section ==============+
    //Here, we'll store the result instead of printing it, storing a None
    //if there was a timeout

    var commandResult : Option[String] = None
    receiveWithin(WAIT_TIME) {
        case TIMEOUT => commandResult = None
        case result:String => commandResult = Some(result)
    }

    //Here we interpret the result to return our boolean value
    commandResult match {
        case None => false
        case Some(s) => //... You'll have to transform the result to a true/false
            //however is most applicable to your use case
    }
}
...