2

( 、、などFutureを介して)の結果を使用する scala プロセスを実行するたびに、プロセスが終了せず、プ​​ロセスを手動で強制終了する必要があります。これは、私が使用しているか、標準的な方法を使用しているかに関係なく発生します。 AwaitmaponCompleteextends Appdef main(args: Array[String])

ThreadPoolExecutor関数の最後にぶら下がっているを実行するためにscalaがスピンアップすることに関連しているFutureように思えますが、それを閉じるためのハンドルを取得できないようです。

たとえば、次のコードは終了に失敗します。

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))
}

このコードは問題なく終了しますが (唯一の変更点は、Future を返す Async バージョンで、それが Awaited になります):

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最終的に Play ライブラリの HTTP クライアントを実行して Future を作成します。ただし、Future を他の方法で実行した場合にも、これが見られました。

val request = wsClient.url(fullUrl)
    .withRequestTimeout(readTimeout)
val requestWithHeaders = headers.foldLeft(request) { (r, h) =>
  r.withHeaders(h)
}
val playResponseFuture = requestWithHeaders.post(requestBody)
4

2 に答える 2

0

私たちは問題を見つけることになりました。Play wsClient にはアクター システムが必要です (Play 2.5 以降)。メイン クラスを終了する前に、このアクター システムを手動で終了する必要がありました。終了するコードは次のようになります。

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()
 }
}
于 2016-10-16T22:27:06.410 に答える
-1

将来の価値をマッピングしThread.sleep()、最後に追加することができます。

val result = layersResponse  map { futureValue =>
 Json.parse(layerResponse)
}

Thread.sleep(10000)
println(Json.prettyPrint(result))
于 2016-10-13T18:56:06.380 に答える