Сделать что-то если сервер залип
Есть такой сервер
listener, _ := net.Listen("tcp", ":8282")
server := &http.Server{
ReadTimeout: 10 * time.Second,
ReadHeaderTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
}
server.Serve(listener)
Мне нужно, чтобы по истечении таймаута происходило какое то действие. Просто мой сервер, в случае потери связи с бд, пытается подключиться у ней обратно и на это время сервер просто зависает, а хочется чтобы он не зависал, а делел действие по окончании например 10 секунд. Например перенаправлял на другой роут, где покажет что на сайте тех работы. При этом сервер продолжал бы переподключаться к бд. Чтобы было понимание, вот код который вешает сервер.
func ErrorGRPCServer() {
conn := serviceOwn.ReadFile("/.connect.txt")
if err := recover(); err != nil {
for {
time.Sleep(2 * time.Second)
_, errConnect := pgx.Connect(context.Background(), conn)
if errConnect == nil {
log.Println("\nConnection OK. Database avialiable")
break
}
log.Println(status.Errorf(500, "%s", "InternalGRPCServerErrorButServerUP! Can't make external request!"))
log.Println(status.Code(errConnect), errConnect)
}
}
log.Println(status.Errorf(200, "%s", "OK"))
}
Вот код который я хочу выполнить при зависании сервера
func ServerIsBusy(w http.ResponseWriter, r *http.Request) {
templBusy, _ := template.ParseFiles("../static/error.html")
data := Data{
Error: "Engineering works. We fix it soon.",
}
templBusy.Execute(w, data)
}
Находится это все в разных файлах и обработка ошибок происходит для grpc сервера и это он переподключается к бд пока не получится. Полный код здесь
UPD:
Обновил строку запска сервера
http.ListenAndServe(":8282", http.TimeoutHandler(handleFillTempl, 10*time.Second, "timeout"))
, поведение похожее. Но с ней при заходе на любой роут сначала идет отсчет а затем вывод timeout. А нужно,чтобы то что работает без бд продолжало работать. В кратце: если сервер не отвечает в течение 10 секунд, то выводть html о техработах.
Ответы (1 шт):
router := mux.NewRouter()
router.HandleFunc("/home/", ShowForms)
router.HandleFunc("/home/welcome/", FillHTML)
muxWithMiddlewares := http.TimeoutHandler(router, time.Second*10, "Timeout!")
http.ListenAndServe(":8282", muxWithMiddlewares)
Сделал все через роутер. Работает таймаут))