Skip to content

Commit 2e3c692

Browse files
authored
Merge pull request #49 from pior/manager
Simplify the Manager API and code
2 parents 8e46022 + 05a86c0 commit 2e3c692

9 files changed

Lines changed: 394 additions & 272 deletions

File tree

README.md

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func run(ctx context.Context) error {
4141
- [Process start and shutdown](#process-start-and-shutdown)
4242
- [Restart](#restart)
4343
- [HTTP Server](#http-server)
44-
- [Dependency Manager](#dependency-manager)
44+
- [Manager](#manager)
4545

4646
### Process start and shutdown
4747

@@ -96,38 +96,36 @@ func main() {
9696
}
9797
```
9898

99-
### Dependency Manager
99+
### Manager
100100

101-
The `Manager` runnable starts and stops all runnables while respecting the dependency between them.
102-
Components with dependencies will be stopped before their dependencies.
101+
The `Manager` groups runnables into two tiers: **processes** (foreground work) and **services** (infrastructure).
102+
Shutdown is triggered when the context is cancelled or any runnable completes.
103+
During shutdown, processes are stopped first, then services — ensuring services remain available while processes drain.
103104

104-
Example with three components:
105105
```go
106-
g := runnable.NewManager()
107-
g.Add(jobQueue)
108-
g.Add(httpServer, jobQueue) // jobs is a dependency
109-
g.Add(monitor)
106+
g := runnable.Manager()
107+
g.RegisterService(jobQueue)
108+
g.Register(httpServer)
109+
g.Register(monitor)
110110

111-
runnable.Run(g.Build())
111+
runnable.Run(g)
112112
```
113113

114114
<details>
115115
<summary markdown="span">Logs of a demo app</summary>
116116

117117
```shell
118-
$ go run ./examples/example
119-
level=INFO msg=started runnable=manager/JobQueue
118+
$ go run ./examples/example/
119+
level=INFO msg=started runnable=manager/StupidJobQueue
120120
level=INFO msg=started runnable=manager/httpserver
121-
level=INFO msg=started runnable=manager/Monitor
121+
level=INFO msg=started runnable=manager/every-3s/RunnableFunc
122122
...
123-
^Clevel=INFO msg="received signal" runnable=signal/manager signal=interrupt
123+
^C
124+
level=INFO msg="signal received" runnable=signal signal=interrupt
124125
level=INFO msg="starting shutdown" runnable=manager reason="context cancelled"
125-
level=INFO msg=cancelled runnable=manager/httpserver
126-
level=INFO msg=cancelled runnable=manager/Monitor
127-
level=INFO msg=stopped runnable=manager/Monitor
128126
level=INFO msg=stopped runnable=manager/httpserver
129-
level=INFO msg=cancelled runnable=manager/JobQueue
130-
level=INFO msg=stopped runnable=manager/JobQueue
127+
level=INFO msg=stopped runnable=manager/every-3s/RunnableFunc
128+
level=INFO msg=stopped runnable=manager/StupidJobQueue
131129
level=INFO msg="shutdown complete" runnable=manager
132130
```
133131

example_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ func (*CleanupTask) Run(ctx context.Context) error {
5151
func Example() {
5252
runnable.SetLogger(slog.New(slog.NewTextHandler(os.Stdout, nil)))
5353

54-
g := runnable.NewManager()
54+
g := runnable.Manager()
5555

5656
jobs := NewJobs()
57-
g.Add(jobs)
57+
g.RegisterService(jobs)
5858

5959
server := &http.Server{
6060
Addr: "127.0.0.1:8080",
@@ -63,7 +63,7 @@ func Example() {
6363
jobs.Perform(id)
6464
}),
6565
}
66-
g.Add(runnable.HTTPServer(server), jobs)
66+
g.Register(runnable.HTTPServer(server))
6767

6868
task := runnable.FuncNamed("enqueue", func(ctx context.Context) error {
6969
_, _ = http.Post("http://127.0.0.1:8080/?id=1", "test/plain", nil)
@@ -72,12 +72,12 @@ func Example() {
7272

7373
return nil // quit right away, will trigger a shutdown
7474
})
75-
g.Add(task)
75+
g.Register(task)
7676

7777
cleanup := runnable.Every(&CleanupTask{}, time.Hour)
78-
g.Add(cleanup, jobs)
78+
g.Register(cleanup)
7979

80-
runnable.Run(g.Build())
80+
runnable.Run(g)
8181

8282
// level=INFO msg=started runnable=manager/Jobs
8383
// level=INFO msg=started runnable=manager/httpserver

examples/example/main.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ func main() {
2727
})
2828
monitor = runnable.Every(monitor, 3*time.Second)
2929

30-
g := runnable.NewManager()
31-
g.Add(jobs)
32-
g.Add(serverRunner, jobs) // jobs is a dependency
33-
g.Add(monitor)
30+
g := runnable.Manager()
31+
g.RegisterService(jobs)
32+
g.Register(serverRunner)
33+
g.Register(monitor)
3434

35-
runnable.Run(g.Build())
35+
runnable.Run(g)
3636
}

examples/test/main.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,10 @@ func main() {
147147
db := &DB{metrics: metrics}
148148
server := &ServerWithDB{db}
149149

150-
g := runnable.NewManager()
151-
g.Add(metrics)
152-
g.Add(db, metrics)
153-
g.Add(server, db)
150+
g := runnable.Manager()
151+
g.RegisterService(metrics)
152+
g.RegisterService(db)
153+
g.Register(server)
154154

155-
runnable.Run(g.Build())
155+
runnable.Run(g)
156156
}

0 commit comments

Comments
 (0)