( 、、などFuture
を介して)の結果を使用する scala プロセスを実行するたびに、プロセスが終了せず、プロセスを手動で強制終了する必要があります。これは、私が使用しているか、標準的な方法を使用しているかに関係なく発生します。 Await
map
onComplete
extends App
def 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)