Skip to content

Commit 4541eeb

Browse files
committed
feat :シグナルハンドリングを実装しました
1 parent e8e3202 commit 4541eeb

File tree

1 file changed

+32
-6
lines changed

1 file changed

+32
-6
lines changed

typing-server/api/cmd/main.go

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import (
44
"context"
55
"log/slog"
66
"net/http"
7+
"os"
8+
"os/signal"
79
"sync"
10+
"syscall"
811
"time"
912

1013
"github.com/go-sql-driver/mysql"
@@ -56,17 +59,40 @@ func main() {
5659

5760
// WaitGroupの宣言
5861
var wg sync.WaitGroup
59-
62+
// エラーを通知するためのチャネル
63+
errChan := make(chan error, 1)
64+
// シグナルハンドリングの準備
65+
sigChan := make(chan os.Signal, 1)
66+
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
6067
// HTTPサーバーの非同期起動
6168
wg.Add(1)
6269
go func() {
6370
defer wg.Done() // 関数終了時にWaitGroupをデクリメント
64-
logger.Info("server is running at http://localhost:8080")
65-
if err := http.ListenAndServe(":8080", nil); err != nil {
66-
logger.Error("failed to listen and serve: %v", err)
67-
return
71+
// サーバーの設定
72+
server := &http.Server{Addr: ":8080"}
73+
// 非同期でサーバーを開始
74+
go func() {
75+
logger.Info("server is running at Addr :8080")
76+
if err := server.ListenAndServe(); err != http.ErrServerClosed {
77+
logger.Error("failed to listen and serve: %v", err)
78+
errChan <- err // エラーをチャネルに送信
79+
}
80+
}()
81+
// シグナルを待機
82+
<-sigChan
83+
logger.Info("shutting down the server...")
84+
if err := server.Shutdown(nil); err != nil {
85+
logger.Error("error during server shutdown: %v", err)
86+
errChan <- err // エラーをチャネルに送信
6887
}
6988
}()
70-
89+
select {
90+
case <-errChan: // エラーが発生した場合
91+
logger.Error("server stopped due to an error")
92+
case sig := <-sigChan: // シグナルを受信した場合
93+
logger.Info("received signal: %s", sig)
94+
}
7195
wg.Wait() // HTTPサーバーの終了を待機
96+
close(errChan)
97+
logger.Info("server exited")
7298
}

0 commit comments

Comments
 (0)