LifecycleHandler:
                  
                  
                  
                  
                  
                  struct TestService: LifecycleHandler {
                  
                  
                      let promise: EventLoopPromise<Void>
                  
                  
                      
                  
                  
                      init(eventLoop: EventLoop) {
                  
                  
                          self.promise = eventLoop.makePromise()
                  
                  
                          self.promise.succeed()
                  
                  
                      }
                  
                  
                      
                  
                  
                      func shutdownAsync(_ application: Application) async {
                  
                  
                          try! await promise.futureResult.get()
                  
                  
                          print("Test service shutdown finished")
                  
                  
                      }
                  
                  
                  }
                  
                  
                  
                  
                  
                  При шатдауне дожидается выполнение чего-нибудь (для примера промис, который уже заполнен)
                  
                  
                  
                  
                  
                  И функция configure:
                  
                  
                  
                  
                  
                  public func configure(_ app: Application) async throws {
                  
                  
                      app.databases.use(.postgres(configuration: .init(hostname: "localhost", username: "postgres", database: "crash", tls: .prefer(try .init(configuration: .clientDefault)))), as: .psql)
                  
                  
                      
                  
                  
                      try await print(User.query(on: app.db).count()) // запрос к бд для примера
                  
                  
                      
                  
                  
                      let eventLoop = app.eventLoopGroup.any()
                  
                  
                      let service = TestService(eventLoop: eventLoop)
                  
                  
                      app.lifecycle.use(service)
                  
                  
                  }
                  
                  
                  
                  
                  
                  И при попытке завершить приложение кодом SIGTERM или Ctrl+C - оно просто подвисает и не завершается. А в логах висит "Test service shutdown finished".
                  
                  
                  
                  
                  
                  Экспериментальным способом я выяснил что если:
                  
                  
                  1. Убрать запрос к бд
                  
                  
                  или
                  
                  
                  2. Поменять eventLoop сервиса с .any() на .next()
                  
                  
                  Тогда всё будет работать как положено (после завершения сервиса - завершается приложение)
                  
                  
                  
                  
                  
                  Подскажите в чём проблема с запросом или .any()?
                  
                  
                
Стикер
Стикер
Пробовал, не помогает
Стикер
Значит, выполнять запрос к бд всё ещё рановато. Тебе он принципиален или это просто для примера? P.S. Посмотрел у себя — в одном из хэндлеров есть такой код: try? app.disco.unregister(self.execInstance, eventLoop: app.eventLoopGroup.any()).wait() Работает. Но у меня всё без async/await. И еще я бы не стал мешать вместе без необходимости async-методы с eventLoop-методами. Попробуй вместо shutdownAsync() применить просто shutdown(), изменив соответствующим образом код метода?
Обсуждают сегодня