1
1
package cmd
2
2
3
3
import (
4
- "github.com/ouqiang/gocron/modules/app "
5
- "github.com/ouqiang/gocron/routers "
6
- "github.com/urfave/cli "
7
- "gopkg.in/macaron.v1 "
8
- "os "
9
- "os/signal "
10
- "syscall "
11
- "github.com/ouqiang/gocron/modules/logger "
12
- "github.com/ouqiang/gocron/service "
13
- "github.com/ouqiang/gocron/models "
14
- "github.com/ouqiang/gocron/modules/setting "
15
- "time "
16
- "github.com/ouqiang/gocron/modules/rpc/grpcpool "
4
+ "github.com/ouqiang/gocron/models "
5
+ "github.com/ouqiang/gocron/modules/app "
6
+ "github.com/ouqiang/gocron/modules/logger "
7
+ "github.com/ouqiang/gocron/modules/rpc/grpcpool "
8
+ "github.com/ouqiang/gocron/modules/setting "
9
+ "github.com/ouqiang/gocron/routers "
10
+ "github.com/ouqiang/gocron/service "
11
+ "github.com/urfave/cli "
12
+ "gopkg.in/macaron.v1 "
13
+ "os "
14
+ "os/signal "
15
+ "syscall "
16
+ "time "
17
17
)
18
18
19
19
// web服务器默认端口
20
20
const DefaultPort = 5920
21
21
22
-
23
22
var CmdWeb = cli.Command {
24
- Name : "web" ,
25
- Usage : "run web server" ,
26
- Action : runWeb ,
27
- Flags : []cli.Flag {
28
- cli.StringFlag {
29
- Name : "host" ,
30
- Value : "0.0.0.0" ,
31
- Usage : "bind host" ,
32
- },
33
- cli.IntFlag {
34
- Name : "port,p" ,
35
- Value : DefaultPort ,
36
- Usage : "bind port" ,
37
- },
38
- cli.StringFlag {
39
- Name : "env,e" ,
40
- Value : "prod" ,
41
- Usage : "runtime environment, dev|test|prod" ,
42
- },
43
- },
23
+ Name : "web" ,
24
+ Usage : "run web server" ,
25
+ Action : runWeb ,
26
+ Flags : []cli.Flag {
27
+ cli.StringFlag {
28
+ Name : "host" ,
29
+ Value : "0.0.0.0" ,
30
+ Usage : "bind host" ,
31
+ },
32
+ cli.IntFlag {
33
+ Name : "port,p" ,
34
+ Value : DefaultPort ,
35
+ Usage : "bind port" ,
36
+ },
37
+ cli.StringFlag {
38
+ Name : "env,e" ,
39
+ Value : "prod" ,
40
+ Usage : "runtime environment, dev|test|prod" ,
41
+ },
42
+ },
44
43
}
45
44
46
45
func runWeb (ctx * cli.Context ) {
47
- // 设置运行环境
48
- setEnvironment (ctx )
49
- // 初始化应用
50
- app .InitEnv (ctx .App .Version )
51
- // 初始化模块 DB、定时任务等
52
- initModule ()
53
- // 捕捉信号,配置热更新等
54
- go catchSignal ()
55
- m := macaron .Classic ()
56
-
57
- // 注册路由
58
- routers .Register (m )
59
- // 注册中间件.
60
- routers .RegisterMiddleware (m )
61
- host := parseHost (ctx )
62
- port := parsePort (ctx )
63
- m .Run (host , port )
46
+ // 设置运行环境
47
+ setEnvironment (ctx )
48
+ // 初始化应用
49
+ app .InitEnv (ctx .App .Version )
50
+ // 初始化模块 DB、定时任务等
51
+ initModule ()
52
+ // 捕捉信号,配置热更新等
53
+ go catchSignal ()
54
+ m := macaron .Classic ()
55
+
56
+ // 注册路由
57
+ routers .Register (m )
58
+ // 注册中间件.
59
+ routers .RegisterMiddleware (m )
60
+ host := parseHost (ctx )
61
+ port := parsePort (ctx )
62
+ m .Run (host , port )
64
63
}
65
64
66
- func initModule () {
67
- if ! app .Installed {
68
- return
69
- }
65
+ func initModule () {
66
+ if ! app .Installed {
67
+ return
68
+ }
70
69
71
- config , err := setting .Read (app .AppConfig )
72
- if err != nil {
73
- logger .Fatal ("读取应用配置失败" , err )
74
- }
75
- app .Setting = config
70
+ config , err := setting .Read (app .AppConfig )
71
+ if err != nil {
72
+ logger .Fatal ("读取应用配置失败" , err )
73
+ }
74
+ app .Setting = config
76
75
77
- // 初始化DB
78
- models .Db = models .CreateDb ()
76
+ // 初始化DB
77
+ models .Db = models .CreateDb ()
79
78
80
- // 版本升级
81
- upgradeIfNeed ()
79
+ // 版本升级
80
+ upgradeIfNeed ()
82
81
83
- // 初始化定时任务
84
- serviceTask := new (service.Task )
85
- serviceTask .Initialize ()
82
+ // 初始化定时任务
83
+ serviceTask := new (service.Task )
84
+ serviceTask .Initialize ()
86
85
}
87
86
88
87
// 解析端口
89
88
func parsePort (ctx * cli.Context ) int {
90
- var port int = DefaultPort
91
- if ctx .IsSet ("port" ) {
92
- port = ctx .Int ("port" )
93
- }
94
- if port <= 0 || port >= 65535 {
95
- port = DefaultPort
96
- }
97
-
98
- return port
89
+ var port int = DefaultPort
90
+ if ctx .IsSet ("port" ) {
91
+ port = ctx .Int ("port" )
92
+ }
93
+ if port <= 0 || port >= 65535 {
94
+ port = DefaultPort
95
+ }
96
+
97
+ return port
99
98
}
100
99
101
- func parseHost (ctx * cli.Context ) string {
102
- if ctx .IsSet ("host" ) {
103
- return ctx .String ("host" )
104
- }
100
+ func parseHost (ctx * cli.Context ) string {
101
+ if ctx .IsSet ("host" ) {
102
+ return ctx .String ("host" )
103
+ }
105
104
106
- return "0.0.0.0"
105
+ return "0.0.0.0"
107
106
}
108
107
109
- func setEnvironment (ctx * cli.Context ) {
110
- var env string = "prod"
111
- if ctx .IsSet ("env" ) {
112
- env = ctx .String ("env" )
113
- }
114
-
115
- switch env {
116
- case "test" :
117
- macaron .Env = macaron .TEST
118
- case "dev" :
119
- macaron .Env = macaron .DEV
120
- default :
121
- macaron .Env = macaron .PROD
122
- }
108
+ func setEnvironment (ctx * cli.Context ) {
109
+ var env string = "prod"
110
+ if ctx .IsSet ("env" ) {
111
+ env = ctx .String ("env" )
112
+ }
113
+
114
+ switch env {
115
+ case "test" :
116
+ macaron .Env = macaron .TEST
117
+ case "dev" :
118
+ macaron .Env = macaron .DEV
119
+ default :
120
+ macaron .Env = macaron .PROD
121
+ }
123
122
}
124
123
125
124
// 捕捉信号
126
- func catchSignal () {
127
- c := make (chan os.Signal )
128
- // todo 配置热更新, windows 不支持 syscall.SIGUSR1, syscall.SIGUSR2
129
- signal .Notify (c , syscall .SIGHUP , syscall .SIGINT , syscall .SIGTERM )
130
- for {
131
- s := <- c
132
- logger .Info ("收到信号 -- " , s )
133
- switch s {
134
- case syscall .SIGHUP :
135
- logger .Info ("收到终端断开信号, 忽略" )
136
- case syscall .SIGINT , syscall .SIGTERM :
137
- shutdown ()
138
- }
139
- }
125
+ func catchSignal () {
126
+ c := make (chan os.Signal )
127
+ // todo 配置热更新, windows 不支持 syscall.SIGUSR1, syscall.SIGUSR2
128
+ signal .Notify (c , syscall .SIGHUP , syscall .SIGINT , syscall .SIGTERM )
129
+ for {
130
+ s := <- c
131
+ logger .Info ("收到信号 -- " , s )
132
+ switch s {
133
+ case syscall .SIGHUP :
134
+ logger .Info ("收到终端断开信号, 忽略" )
135
+ case syscall .SIGINT , syscall .SIGTERM :
136
+ shutdown ()
137
+ }
138
+ }
140
139
}
141
140
142
-
143
141
// 应用退出
144
- func shutdown () {
145
- defer func () {
146
- logger .Info ("已退出" )
147
- os .Exit (0 )
148
- }()
149
-
150
- if ! app .Installed {
151
- return
152
- }
153
- logger .Info ("应用准备退出" )
154
- serviceTask := new (service.Task )
155
- // 停止所有任务调度
156
- logger .Info ("停止定时任务调度" )
157
- serviceTask .StopAll ()
158
-
159
- taskNumInRunning := service .TaskNum .Num ()
160
- logger .Infof ("正在运行的任务有%d个" , taskNumInRunning )
161
- if taskNumInRunning > 0 {
162
- logger .Info ("等待所有任务执行完成后退出" )
163
- }
164
- for {
165
- if taskNumInRunning <= 0 {
166
- break
167
- }
168
- time .Sleep (3 * time .Second )
169
- taskNumInRunning = service .TaskNum .Num ()
170
- }
171
-
172
- // 释放gRPC连接池
173
- grpcpool .Pool .ReleaseAll ()
142
+ func shutdown () {
143
+ defer func () {
144
+ logger .Info ("已退出" )
145
+ os .Exit (0 )
146
+ }()
147
+
148
+ if ! app .Installed {
149
+ return
150
+ }
151
+ logger .Info ("应用准备退出" )
152
+ serviceTask := new (service.Task )
153
+ // 停止所有任务调度
154
+ logger .Info ("停止定时任务调度" )
155
+ serviceTask .StopAll ()
156
+
157
+ taskNumInRunning := service .TaskNum .Num ()
158
+ logger .Infof ("正在运行的任务有%d个" , taskNumInRunning )
159
+ if taskNumInRunning > 0 {
160
+ logger .Info ("等待所有任务执行完成后退出" )
161
+ }
162
+ for {
163
+ if taskNumInRunning <= 0 {
164
+ break
165
+ }
166
+ time .Sleep (3 * time .Second )
167
+ taskNumInRunning = service .TaskNum .Num ()
168
+ }
169
+
170
+ // 释放gRPC连接池
171
+ grpcpool .Pool .ReleaseAll ()
174
172
}
175
173
176
174
// 判断应用是否需要升级, 当存在版本号文件且版本小于app.VersionId时升级
177
- func upgradeIfNeed () {
178
- currentVersionId := app .GetCurrentVersionId ()
179
- // 没有版本号文件
180
- if currentVersionId == 0 {
181
- return ;
182
- }
183
- if currentVersionId >= app .VersionId {
184
- return
185
- }
186
-
187
- migration := new (models.Migration )
188
- logger .Infof ("版本升级开始, 当前版本号%d" , currentVersionId )
189
-
190
- migration .Upgrade (currentVersionId )
191
- app .UpdateVersionFile ()
192
-
193
- logger .Infof ("已升级到最新版本%d" , app .VersionId )
194
- }
175
+ func upgradeIfNeed () {
176
+ currentVersionId := app .GetCurrentVersionId ()
177
+ // 没有版本号文件
178
+ if currentVersionId == 0 {
179
+ return
180
+ }
181
+ if currentVersionId >= app .VersionId {
182
+ return
183
+ }
184
+
185
+ migration := new (models.Migration )
186
+ logger .Infof ("版本升级开始, 当前版本号%d" , currentVersionId )
187
+
188
+ migration .Upgrade (currentVersionId )
189
+ app .UpdateVersionFile ()
190
+
191
+ logger .Infof ("已升级到最新版本%d" , app .VersionId )
192
+ }
0 commit comments