使用scala future运行顺序进程

时间:2014-04-18 15:08:14

标签: scala process future

我有两个外部进程要按顺序运行:

  val antProc = Process(Seq(antBatch","everythingNoJunit"), new File(scriptDir))

  val bossProc = Process(Seq(bossBatch,"-DcreateConnectionPools=true"))

  val f: Future[Process] = Future {
    println("Run ant...")
    antProc.run
  }
  f onSuccess {
    case proc => {
      println("Run boss...")
      bossProc.run
    }
  }

结果是:

  Run ant...

  Process finished with exit code 0

如何运行antProc直到完成,然后是bossProc?

以下方法似乎达到了目的。但是,这不是未来的方法。

    antProc.!<
    bossProc.!<

1 个答案:

答案 0 :(得分:3)

你应该可以这样做:

val antProc = Process(Seq(antBatch,"everythingNoJunit"), new File(scriptDir))
val bossProc = Process(Seq(bossBatch,"-DcreateConnectionPools=true"))
val antFut: Future[Process] = Future {      
  antProc.run
}
val bossFut: Future[Process] = Future {      
  bossProc.run
}
val aggFut = for{
  antRes <- antFut
  bossRes <- bossFut
} yield (antRes, bossRes)

aggFut onComplete{
  case tr => println(tr)
}

aggFut的结果将是一个由蚂蚁结果和boss结果组成的元组。

另外,在发生异步回调之前,请确保运行此命令的vm没有退出。如果执行上下文包含守护程序线程,则它可能在完成之前退出。

现在,如果你想让bossProc在antProc之后运行,那么代码就像这样

val antProc = Process(Seq(antBatch,"everythingNoJunit"), new File(scriptDir))
val bossProc = Process(Seq(bossBatch,"-DcreateConnectionPools=true"))
val antFut: Future[Process] = Future {      
  antProc.run
}
val aggFut = for{
  antRes <- antFut
  bossRes <- Future {bossProc.run}
} yield (antRes, bossRes)

aggFut onComplete{
  case tr => println(tr)
}