【问题标题】:Scala future app terminates before completeScala未来应用程序在完成之前终止
【发布时间】:2014-05-08 16:52:40
【问题描述】:

只是试图让我的第一个期货使用并运行并进行类似于 Akka in Action MEAP 书中概述的示例的测试。我想调用 Web 服务并在将来返回结果。我正在使用 scalaxb 访问网络服务。我已经概述了下面的代码,但是当我运行它时,应用程序会终止而无需等待服务的响应。也许有人可以告诉我我错过了什么?

import scala.util._
import control.NonFatal
import scala.concurrent._
import ExecutionContext.Implicits.global

object Test {


    val service = (new MyServiceBindings with scalaxb.Soap11Clients with scalaxb.DispatchHttpClients {}).service

    def test = {

        val f = future {

            service.someCall() match {
                case Right(resp) => resp
                case Left(fault) => throw new Exception("Fault: " + fault)}
            }
        }

        f.onComplete {
            case Success(resp) => println("Resp: " + resp)
            case Failure(NonFatal(e)) => println("Fail: " + e)
        }
    }

    def main(args: Array[String]): Unit = {
        test
    }
}

【问题讨论】:

  • 您是否尝试过使用Await

标签: scala akka scalaxb


【解决方案1】:

它终止是因为在您的测试中执行的主线程已经完成。 Dispatch 库内部使用的线程不会阻止程序退出。

您需要等待未来,因为这是您的测试应用唯一要做的事情。将其放在 onComplete 语句之后。

import scala.concurrent.duration._ Await.ready(f, 10.seconds)

现在请记住,这通常是不好的做法。您在这里需要它,因为您的测试应用程序没有做任何其他事情,但在真正的应用程序中,您不希望在每次调用期货后阻塞,因为这会否定使用期货的意义。

【讨论】:

    【解决方案2】:

    您可以通过将以下逻辑添加到您的测试应用程序中,在 main 函数中对此进行修补:

    def main(args: Array[String]) :  Unit = {
    
      // Assuming test is a future that did not complete yet.
      while(!test.isCompleted) { 
           Thread.sleep(100) 
      }
      // Software exits here only after future is completed.  
    }
    

    或者如果你有很多未来,你可以通过这种方式实现它:

    // 假设你有 --> listOfFutures = ArrayBuffer[Future]

    def main(args: Array[String]) : Unit = {
       while(!listOfFutures.isEmpty) {
          listOfFutures.foreach {
             future =>
              if(future.isCompleted) {
                 listOfFutures -= future
              }
          }
          //checks which futures are completed every half-a-second
          Thread.sleep(500) 
       }
       // Program exits after all futures have been completed.
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-01
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 2017-08-31
      • 2020-02-26
      • 2011-04-19
      • 1970-01-01
      • 2016-01-12
      相关资源
      最近更新 更多