Хотите остановить http сервер удаленно - PullRequest
1 голос
/ 14 июля 2011

Я хочу остановить http-сервер удаленно (что я могу сделать), но я также хочу получить сообщение о том, что он был остановлен после его остановки.Это вызывает у меня некоторые проблемы.Единственное решение, которое я смог найти, это как показано ниже, которое я не считаю идеальным.Может ли кто-нибудь предоставить лучшее решение.Проблема заключается в том, что последнее сообщение, отправленное клиенту, не проходит, пока я не использую программу, как показано в конце "go func () {".

Код выглядит следующим образом:


//*************
func stopServer(ohtWriter http.ResponseWriter, phtRequest *http.Request) {// Stop The Server
//*************

    var iBytesSent  int
    var oOsError    os.Error
    var sErmes  string

    println("Stopping Server")

    iBytesSent,oOsError = ohtWriter.Write([]byte("Message from server - server now stopped."))

    if oOsError != nil {
        sErmes = ". Error = " +oOsError.String()
    } else {
        sErmes = ". No error on write"
    }

    println("stopServer: Bytes sent = " +strconv.Itoa(iBytesSent) +sErmes)

    ohtFlusher, tCanFlush := ohtWriter.(http.Flusher)
    if tCanFlush {
        ohtFlusher.Flush()
    }

    go func() {
        time.Sleep(3e9)
        os.Exit(0)
    }()
}

Ответы [ 3 ]

2 голосов
/ 15 июля 2011

Да, я думаю, что без поддержки пакета http, постепенное отключение невозможно. Это может быть немного менее требовательно, но все равно закроет любые другие параллельные запросы в полете во время этого запроса. Возможно, попробуйте отправить запрос на функцию отслеживания проблем Go . А еще лучше, откройте пакет http, добавьте метод корректного завершения работы и отправьте его .

Редактировать: Полагаю, если вы контролируете все http.Handlers в своем приложении, вы можете сохранить количество запросов в полете (используя соответствующую синхронизацию потоков) и изменить приведенный ниже код, чтобы ) отказаться от новых подключений после вызова «shutdown» и b) дождаться завершения всех запросов в полете, прежде чем завершить работу ...

package main

import (
    "http"
    "os"
    "io"
    "log"
    "strconv"
)

func main() {
    http.HandleFunc("/", ServeHTTP)
    http.ListenAndServe(":8081", nil)
}

const responseString = "Shutting down\n"

func ServeHTTP(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "text/plain; charset=utf-8")
    w.Header().Set("Content-Length", strconv.Itoa(len(responseString)))
    io.WriteString(w, responseString)

    f, canFlush := w.(http.Flusher)
    if canFlush {
        f.Flush()
    }

    conn, _, err := w.(http.Hijacker).Hijack()
    if err != nil {
        log.Fatalf("error while shutting down: %v", err)
    }

    conn.Close()

    log.Println("Shutting down")
    os.Exit(0)
}   
0 голосов
/ 15 июня 2014

Вот простой способ, который подходит для локальной разработки.

http://www.sergiotapia.me/how-to-stop-your-go-http-server/


package main

import (  
    "net/http"
    "os"

    "github.com/bmizerany/pat"
)

var mux = pat.New()

func main() {  
    mux.Get("/kill", http.HandlerFunc(kill))
    http.Handle("/", mux)
    http.ListenAndServe(":8080", nil)
}

func kill(w http.ResponseWriter, r *http.Request) {  
    os.Exit(0)
}
0 голосов
/ 15 июля 2011

Еще не пробовал, но использование http.ServerConn напрямую может работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...