@@ -4,7 +4,10 @@ import (
4
4
"context"
5
5
"log/slog"
6
6
"net/http"
7
+ "os"
8
+ "os/signal"
7
9
"sync"
10
+ "syscall"
8
11
"time"
9
12
10
13
"github.com/go-sql-driver/mysql"
@@ -56,17 +59,40 @@ func main() {
56
59
57
60
// WaitGroupの宣言
58
61
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 )
60
67
// HTTPサーバーの非同期起動
61
68
wg .Add (1 )
62
69
go func () {
63
70
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 // エラーをチャネルに送信
68
87
}
69
88
}()
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
+ }
71
95
wg .Wait () // HTTPサーバーの終了を待機
96
+ close (errChan )
97
+ logger .Info ("server exited" )
72
98
}
0 commit comments