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(), изменив соответствующим образом код метода?
Обсуждают сегодня