185 похожих чатов

Помогите разобраться в чём проблема: У меня есть некий сервис, конформящий

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()?

5 ответов

56 просмотров

Стикер

Стикер

Mihail-Verenich Автор вопроса

Пробовал, не помогает

Стикер

Mihail Verenich
Пробовал, не помогает

Значит, выполнять запрос к бд всё ещё рановато. Тебе он принципиален или это просто для примера? P.S. Посмотрел у себя — в одном из хэндлеров есть такой код: try? app.disco.unregister(self.execInstance, eventLoop: app.eventLoopGroup.any()).wait() Работает. Но у меня всё без async/await. И еще я бы не стал мешать вместе без необходимости async-методы с eventLoop-методами. Попробуй вместо shutdownAsync() применить просто shutdown(), изменив соответствующим образом код метода?

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта