1

HTTP サーバーを正常にシャットダウンしようとしています。ここの投稿からヒントを得て、これまでに次のようにコードを設定しました。

func start() {

    //......

    //START HTTP/SOCKET LISTENER
    if settings.TLS {
        httpServer = makeServer("/wss", settings.TLS);
    } else {
        httpServer = makeServer("/ws", settings.TLS);
    }

    //...
}

func makeServer(handleDir string, tls bool) (*http.Server) {
    server := &http.Server{Addr: settings.IP+":"+strconv.Itoa(settings.Port)}
    http.HandleFunc(handleDir, socketInitializer)
    if tls {
        go func() {
            err := server.ListenAndServeTLS(settings.CertFile, settings.PrivKeyFile)
            if err != nil {
                serverError(err)
            }
        }()
    }else{
        go func() {
            err := server.ListenAndServe()
            if err != nil {
                serverError(err)
            }
        }()
    }

    //
    return server
}

したがって、これがどのように機能するかについていくつか質問があります。

1)上記でリンクした回答にはListenAndServe()、ゴルーチン内のエラー処理について「注:次の行が実行される時間がない可能性があります...」と記載されています。serverError()完了が保証されることを確認するにはどうすればよいですか? そのスレッドである種のブロッキングを行う必要がありますか、それともメインスレッドで呼び出すことができるチャネルを作成する必要がありますか?

2) 現時点では、エラーが発生したかどうか、またはエラーが発生してシャットダウンしたかどうかServer.ShutDown()を判断する方法があるかどうかはわかりません。メソッドを使用してもエラーはスローされますかhttp.Server? それが、リンクで受け入れられた回答がエラーをチェックするときに使用する理由ですか?ListenAndServe()Server.ShutDown()err != http.ErrServerClosedListenAndServe()

3)start()関数は (もちろん) メインスレッドで実行されます。プログラムが戻って終了しないように、何らかの形でそのスレッドをブロックする必要はありませんか、ListenAndServe()それとも私のためにそれを処理しますか?

4) 呼び出した後、リスナーServer.ShutDown()をシャットダウンするために何かする必要がありますか?http.HandleFunc()

これらのトピックのいずれかについてのヘルプは大歓迎ですので、一度にすべてに触れられなくても心配しないでください :)

編集: 誰かが私がこれをすべて正しく機能させる方法を見たい場合は、このファイルの 225 行目以降を参照してください。

4

1 に答える 1