在play框架2中使用scala.sys.process

时间:2012-12-13 23:47:01

标签: scala powershell playframework-2.0

我正在尝试通过网络允许某些本地系统服务访问其他用户。

经过一些googleing,我最终选择使用Play框架作为接受webservice调用的前端。收到呼叫后,Play将通过powershell执行一些命令。如,

在我的Application.scala

def test = Action {
    println(Seq("powershell.exe", "dir", "c:").!)
    Ok("")
}

相应的路线信息是

GET      /test     controllers.Application.test

我的问题是虽然对PowerShell的调用结果被打印出来,但该方法永远不会返回。从客户端(浏览器)的角度来看,它只是等待调用... / test返回。

我已经测试了代码本身并且运行正常。我的问题似乎只有在我通过Play运行时才会出现。

非常感谢任何建议!

1 个答案:

答案 0 :(得分:0)

来自ProcessBuilder scaladoc:

abstract def !(log: ProcessLogger): Int
    Starts the process represented by this builder, blocks until it exits, 
    and returns the exit code.

请尝试使用lines - 它将返回Stream

修改

如果命令已经完成,你还没有从流中读取它的输出吗?之后,只需手动调用不同流中的Process.destroy()即可。创建一个actor并从解析Stream的线程向他发送一条消息,它应该关闭进程。或者使用CountDownLatch等待它,这是一种更加Java的方式。