Приложение Scala не выходит, даже если будущее завершено

0

Вопрос

Я жду будущего, чтобы завершить и распечатать содержимое на консоли. Даже когда все закончено, основное приложение не выходит, и мне приходится убивать его вручную.

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

Так results выводится на консоль с ожидаемым соперником, но приложение все еще не заканчивается. Могу ли я что-то сделать, чтобы выйти из приложения? Есть ли еще что-то запущенное, чего ждет главный?

Я использую:

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

Лучший ответ

3

Поскольку вы используете Akka, у вас, скорее всего, есть ActorSystem созданный каким-то образом под капотом, который будет поддерживать процесс в рабочем состоянии.

Либо вы можете наложить на него руку и вызвать его actorSystem.terminate() метод, или вы также можете использовать явный sys.exit(0) в конце вашего основного метода (0 быть кодом выхода, который вы хотите).

Изменить: вы также должны обернуть Awaits в Try и обязательно позвоните sys.exit в том числе и в случае неудач.

2021-10-26 18:23:16

Да, у меня действительно есть implicit val system: ActorSystem = ActorSystem() в объекте, на котором выполняется main.
Seb

Изменение его на явный val system: ActorSystem = ActorSystem(). Потом я позвонил system.terminate() (.завершение работы не рекомендуется), но это все равно не завершает работу приложения. Есть ли другой способ, кроме как позвонить sys.exit(0) как это кажется грубым принуждением и должен быть намеченный способ?
Seb

Моя ошибка заключалась в том, что нужно было поймать все неявные акторсистемы во всех функциях и завершить их после того, как они закончили свою работу. Молодец, это правильный ответ.
Seb

На других языках

Эта страница на других языках

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