代码之家  ›  专栏  ›  技术社区  ›  Ryan Gross

Scala控制台应用程序在等待未来时从不退出

  •  2
  • Ryan Gross  · 技术社区  · 8 年前

    每当我运行使用 Future (要么通过 Await , map , onComplete 等),它永远不会退出,迫使我们手动终止进程。无论我是否使用 extends App 或者只是一个标准 def main(args: Array[String]) 方法

    在我看来,这与 ThreadPoolExecutor scala将旋转以执行 将来 是在函数的末尾徘徊,但我似乎无法处理它来结束它。

    object ExecuteApi extends App with StrictLogging{
    
      lazy val config = StratumConfiguration.setupConfiguration()
      lazy val apiEndpoint = config.getProperty("APIEndpoint").split("/").head
      lazy val packetApiPath = "packets/getpackets"
    
      val resourceNames = sys.env.getOrElse("ResourceNames", "").stripMargin.split("[\n\\s]+").map(_.trim).filterNot(_.isEmpty)
      val searchBody =
      s"""{
        |  "resourceNames": [
        |    "${(resourceNames).mkString("\",\"")}"
        |  ]
        |}""".stripMargin
        logger.info(searchBody)
        val responseFuture = AmazonAsyncApiGatewayHelper.executeHttpRequest(apiEndpoint, searchBody, Some(packetApiPath), Some("api"))
        val response = Await.result(responseFuture, Duration(25, TimeUnit.SECONDS))
        val layerDefinitions = Json.parse(response)
        println(Json.prettyPrint(layerDefinitions))
    }
    

    object ExecuteAPI extends App with StrictLogging{
    
      lazy val config = Configuration.setupConfiguration()
      lazy val apiEndpoint = config.getProperty("APIEndpoint").split("/").head
      lazy val packetApiPath = "packets/getpackets"
    
      val resourceNames = sys.env.getOrElse("ResourceNames", "").stripMargin.split("\n").map(_.trim).filterNot(_.isEmpty)
    
      val searchBody =
      s"""{
        |  "resourceNames": [
        |    "${(resourceNames).mkString("\",\"")}"
        |  ]
        |}""".stripMargin
        logger.info(searchBody)
        val layersResponse = AmazonapiGatewayHelper.executeHttpRequest(apiEndpoint, searchBody, Some(packetApiPath), Some("api"))
        val layerDefinitions = Json.parse(layersResponse)
        println(Json.prettyPrint(layerDefinitions))
    }
    

    代码 AmazonAsyncApiGatewayHelper 最终通过执行播放库HTTP客户端创建未来。然而,我们在以其他方式执行期货时也看到了这一点:

    val request = wsClient.url(fullUrl)
        .withRequestTimeout(readTimeout)
    val requestWithHeaders = headers.foldLeft(request) { (r, h) =>
      r.withHeaders(h)
    }
    val playResponseFuture = requestWithHeaders.post(requestBody)
    
    2 回复  |  直到 8 年前
        1
  •  0
  •   Ryan Gross    8 年前

    object ExecuteAPI extends App with StrictLogging{
     try {
      lazy val config = Configuration.setupConfiguration()
      lazy val apiEndpoint = config.getProperty("APIEndpoint").split("/").head
      lazy val packetApiPath = "packets/getpackets"
    
      val resourceNames = sys.env.getOrElse("ResourceNames", "").stripMargin.split("\n").map(_.trim).filterNot(_.isEmpty)
    
      val searchBody =
      s"""{
        |  "resourceNames": [
        |    "${(resourceNames).mkString("\",\"")}"
        |  ]
        |}""".stripMargin
        logger.info(searchBody)
        val responseFuture = AmazonAsyncApiGatewayHelper.executeHttpRequest(apiEndpoint, searchBody, Some(packetApiPath), Some("api"))
        val response = Await.result(responseFuture, Duration(25, TimeUnit.SECONDS))
        val layerDefinitions = Json.parse(response)
        println(Json.prettyPrint(layerDefinitions))
     } finally {
        AmazonAsyncApiGatewayHelper.client.actorSystem.terminate()
     }
    }
    
        2
  •  -1
  •   Aamir    8 年前

    您可以映射未来价值并添加 Thread.sleep() 最后。

    val result = layersResponse  map { futureValue =>
     Json.parse(layerResponse)
    }
    
    Thread.sleep(10000)
    println(Json.prettyPrint(result))