Aplikacja Scala nie wychodzi, nawet jeśli przyszłość jest zakończona

0

Pytanie

Czekam na przyszłości, aby wypełnić i wydrukować zawartość na konsoli. Nawet gdy wszystko jest skończone, podstawowa aplikacja nie wychodzi i muszę go zabijać ręcznie.

def main(args: Array[String]): Unit {
    val req = HttpRequest(GET, myURL)
    val res = Http().singleRequest(req)
    val resultsFutures = Future {
        val resultString = Await.result(HttpRequests.unpackResponse(res), Duration.Inf)
        JsonMethods.parse(resultString).extract[List[Results]]
    }
    val results = Await.result(resultsFutures, Duration.Inf)
    println(results)
}

Tak results pojawi się na konsolę z oczekiwanym przeciwnikiem, ale aplikacja nadal się nie kończy. Czy mogę coś zrobić, aby wyjść z aplikacji? Czy jest jeszcze coś wszczynający, co czeka na główny?

Używam:

  • scala 2.12.10
  • konta 2.5.26
  • аккаХттп 10.1.11
akka akka-http concurrent.futures scala
2021-10-26 17:59:04
1

Najlepsza odpowiedź

3

Ponieważ używasz Akka, u ciebie prawdopodobnie jest ActorSystem utworzony w jakiś sposób pod maską, który będzie wspierać proces w dobrym stanie.

Albo można nałożyć na niego rękę i spowodować jego actorSystem.terminate() metoda, lub można również użyć wyraźny sys.exit(0) w końcu podstawowego metody (0 być kodem wyjścia, który chcesz).

Zmiana: należy również owinąć Awaits w Try i koniecznie zadzwoń sys.exit w tym i w razie niepowodzeń.

2021-10-26 18:23:16

Tak, rzeczywiście mam implicit val system: ActorSystem = ActorSystem() w obiekcie, w którym odbywa main.
Seb

Zmień go na wyraźny val system: ActorSystem = ActorSystem(). Potem zadzwoniłem do system.terminate() (.zakończenie pracy nie zalecane), ale to i tak nie kończy pracę aplikacji. Czy jest jakiś inny sposób, jak tylko zadzwonić sys.exit(0) jak to wydaje się być brutalnym przymusem i powinien być planowany sposób?
Seb

Mój błąd polegał na tym, że trzeba było złapać wszystkie niejawne акторсистемы we wszystkich funkcjach i zakończyć je po tym, jak skończyli swoją pracę. Brawo, to jest prawidłowa odpowiedź.
Seb

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................