Сделать что-то если сервер залип

Есть такой сервер

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 шт):

Автор решения: umd
router := mux.NewRouter()
    router.HandleFunc("/home/", ShowForms)
    router.HandleFunc("/home/welcome/", FillHTML)
    muxWithMiddlewares := http.TimeoutHandler(router, time.Second*10, "Timeout!")
    http.ListenAndServe(":8282", muxWithMiddlewares)

Сделал все через роутер. Работает таймаут))

→ Ссылка