-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathexample_test.go
183 lines (150 loc) · 5.95 KB
/
example_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
package graterm_test
import (
"context"
"errors"
"fmt"
"log"
"net/http"
"syscall"
"time"
"github.com/skovtunenko/graterm"
)
func ExampleNewWithSignals() {
// create new Terminator instance:
terminator, appCtx := graterm.NewWithSignals(context.Background(), syscall.SIGINT, syscall.SIGTERM)
// register hooks...
// Wire other components ...
// Wait for os.Signal to occur, then terminate application with maximum timeout of 40 seconds:
if err := terminator.Wait(appCtx, 40*time.Second); err != nil {
log.Printf("graceful termination period was timed out: %+v", err)
}
}
func ExampleTerminator_SetLogger() {
// create new Terminator instance:
terminator, _ := graterm.NewWithSignals(context.Background(), syscall.SIGINT, syscall.SIGTERM)
// Set custom logger implementation instead of default NOOP one:
terminator.SetLogger(log.Default())
}
func ExampleTerminator_Wait() {
// create new Terminator instance:
terminator, appCtx := graterm.NewWithSignals(context.Background(), syscall.SIGINT, syscall.SIGTERM)
// register hooks...
// Wire other components ...
// Wait for os.Signal to occur, then terminate application with maximum timeout of 40 seconds:
if err := terminator.Wait(appCtx, 40*time.Second); err != nil {
log.Printf("graceful termination period was timed out: %+v", err)
}
}
func ExampleTerminator_WithOrder_1() {
// Define Orders:
const (
HTTPServerTerminationOrder graterm.Order = 1
MessagingTerminationOrder graterm.Order = 1
DBTerminationOrder graterm.Order = 2
)
// create new Terminator instance:
terminator, appCtx := graterm.NewWithSignals(context.Background(), syscall.SIGINT, syscall.SIGTERM)
terminator.SetLogger(log.Default()) // Optional step
// Register HTTP Server termination hook:
terminator.WithOrder(HTTPServerTerminationOrder).
WithName("HTTP Server"). // setting a Name is optional and will be useful only if logger instance provided
Register(1*time.Second, func(ctx context.Context) {
log.Println("terminating HTTP Server...")
defer log.Println("...HTTP Server terminated")
})
// Register nameless Messaging termination hook:
terminator.WithOrder(MessagingTerminationOrder).
Register(1*time.Second, func(ctx context.Context) {
log.Println("terminating Messaging...")
defer log.Println("...Messaging terminated")
})
// Register Database termination hook:
terminator.WithOrder(DBTerminationOrder).
WithName("DB"). // setting a Name is optional and will be useful only if logger instance provided
Register(1*time.Second, func(ctx context.Context) {
log.Println("terminating DB...")
defer log.Println("...DB terminated")
const sleepTime = 3 * time.Second
select {
case <-time.After(sleepTime):
log.Printf("DB termination sleep time %v is over\n", sleepTime)
case <-ctx.Done():
log.Printf("DB termination Context is Done because of: %+v\n", ctx.Err())
}
})
// Wait for os.Signal to occur, then terminate application with maximum timeout of 20 seconds:
if err := terminator.Wait(appCtx, 20*time.Second); err != nil {
log.Printf("graceful termination period was timed out: %+v", err)
}
}
func ExampleTerminator_WithOrder_2() {
// Define Order for HTTP Server termination:
const HTTPServerTerminationOrder graterm.Order = 1
// create new Terminator instance:
terminator, appCtx := graterm.NewWithSignals(context.Background(), syscall.SIGINT, syscall.SIGTERM)
terminator.SetLogger(log.Default()) // Optional step
// Create an HTTP Server and add one simple handler into it:
httpServer := &http.Server{
Addr: ":8080",
Handler: http.DefaultServeMux,
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello, world!")
})
// Start HTTP server in a separate goroutine:
go func() {
if err := httpServer.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
log.Printf("terminated HTTP Server: %+v\n", err)
}
}()
// Register HTTP Server termination hook:
terminator.WithOrder(HTTPServerTerminationOrder).
WithName("HTTPServer"). // setting a Name is optional and will be useful only if logger instance provided
Register(10*time.Second, func(ctx context.Context) {
if err := httpServer.Shutdown(ctx); err != nil {
log.Printf("shutdown HTTP Server: %+v\n", err)
}
})
// Wait for os.Signal to occur, then terminate application with maximum timeout of 30 seconds:
if err := terminator.Wait(appCtx, 30*time.Second); err != nil {
log.Printf("graceful termination period is timed out: %+v\n", err)
}
}
func ExampleHook_Register() {
// Define Order:
const (
HTTPServerTerminationOrder graterm.Order = 1
)
// create new Terminator instance:
terminator, appCtx := graterm.NewWithSignals(context.Background(), syscall.SIGINT, syscall.SIGTERM)
// Register some hooks:
terminator.WithOrder(HTTPServerTerminationOrder).
Register(1*time.Second, func(ctx context.Context) {
log.Println("terminating HTTP Server...")
defer log.Println("...HTTP Server terminated")
})
// Wait for os.Signal to occur, then terminate application with maximum timeout of 20 seconds:
if err := terminator.Wait(appCtx, 20*time.Second); err != nil {
log.Printf("graceful termination period was timed out: %+v", err)
}
}
func ExampleHook_WithName() {
// Define Order:
const (
HTTPServerTerminationOrder graterm.Order = 1
)
// create new Terminator instance:
terminator, appCtx := graterm.NewWithSignals(context.Background(), syscall.SIGINT, syscall.SIGTERM)
terminator.SetLogger(log.Default()) // Optional step
// Register some hooks:
terminator.WithOrder(HTTPServerTerminationOrder).
WithName("HTTP Server"). // Define (optional) Hook name
Register(1*time.Second, func(ctx context.Context) {
log.Println("terminating HTTP Server...")
defer log.Println("...HTTP Server terminated")
})
// Wait for os.Signal to occur, then terminate application with maximum timeout of 20 seconds:
if err := terminator.Wait(appCtx, 20*time.Second); err != nil {
log.Printf("graceful termination period was timed out: %+v", err)
}
}