Job服务孵化
业务处理中,我们会有编写各种脚本任务的需求,如定时、周期、守护等类型的job,
其实编写任务脚本在流程上是比较标准化的:
- 接受命令行参数
->
解析命令->
选择job->
执行->
记录结果
由此,为了避免这种枯燥重复的工作,我们提供了Job孵化功能,当然目前功能还比较基础,也希望大家多提宝贵意见,共同完善!
接入
使用 rigger 脚手架自动生成
[developer@localhost rigger]$ rigger new job myJob
正克隆到 '/tmp/myJob'...
myJob Job server 已生成!
rigger new job
是命令, myJob
是管理器的文件夹名称,上述命令会在当前目录下生成子目录myJob
目录结构
./myJob
-jobsMap.go #注册jobs
-main.go #job运行主入口
编译
两种方式:
- 在主服务的
Makefile
中增加编译命令 - 直接编译
//执行如下命令会生成可执行文件 myJob
$ cd myJob && go build ./
注册Job
在 myJob/jobsMap.go
中添加, 具体任务可以直接写在此处,也可以引入其他包
jobFuncs的 key 为任务标识
func initFuncMap() {
//example
jobFuncs["testJob"] = clijob.Job{
Name: "testJob",
Task: func() error {
for i := 0; i < 10; i++ {
fmt.Println("testJob")
time.Sleep(time.Second)
}
return nil
},
}
jobFuncs["testJob2"] = clijob.Job{
Name: "testJob2",
Task: func() error {
for i := 0; i < 10; i++ {
fmt.Println("testJob2")
time.Sleep(time.Second)
}
return nil
},
}
}
执行已注册任务
查看job的命令选项
[developer@localhost myJob]$ ./myJob -h
Usage of ./myJob:
-c string
config path
-cfg string
json config path (default "conf/config.json")
-extended string
extended options, You can customize the options to bypass the flag.parse() restrictions
-f foreground
-m mock
-mode int
mode
-p string
config path prefix with no trailing backslash
-s string
start or stop
-usr1 string
user defined flag -usr1
-usr2 string
user defined flag -usr2
-usr3 string
user defined flag -usr3
-usr4 string
user defined flag -usr4
-usr5 string
user defined flag -usr5
-v version
其中Job管理器的默认把-extended
作为解析对象,其值代表任务函数的标识。
选择任务testJob
并执行
$./myJob -extended testJob
testJob
[16:42:29 CST 2019/12/19] [INFO] (server.go:116:561420000000010 localhost.localdomain) doJob [start],任务主入口
[16:42:29 CST 2019/12/19] [INFO] (server.go:116:561420000000011 localhost.localdomain) doJob [start],任务:testJob
testJob
testJob
testJob
testJob
testJob
testJob
testJob
testJob
testJob
[16:42:39 CST 2019/12/19] [INFO] (server.go:118:561420000000011 localhost.localdomain) doJob [end],任务:testJob
[16:42:39 CST 2019/12/19] [INFO] (server.go:118:561420000000010 localhost.localdomain) doJob [end],任务主入口
[16:42:39 CST 2019/12/19] [INFO] (server.go:63:561420000000010 localhost.localdomain) Stop 正在退出...
自定义命令行参数解析
简单修改下myJob/main.go
package main
import (
"fmt"
"github.com/tal-tech/hera/clijob"
logger "github.com/tal-tech/xesLogger"
"github.com/tal-tech/xesTools/flagutil"
)
func main() {
//添加自定义命令行解析器
job := clijob.NewJobServer(clijob.OptSetCmdParser(&MyParser{}))
job.AddJobs(GetFuncs())
err := job.Start()
if err != nil {
fmt.Println("err:", err)
}
}
//-----------------------自定义命令行解析器---------------------------
type MyParser struct {
}
//为了演示自定义命令行参数解析器的用法, 此处复制了一份默认的写法
func (p *MyParser) JobArgParse(jobs map[string]clijob.Job) (selectedJobs []clijob.Job, err error) {
fmt.Println("自定义解析器")
cmdArg := *flagutil.GetExtendedopt()
job, ok := jobs[cmdArg]
if !ok {
return nil, logger.NewError("[ " + cmdArg + " ]任务未定义")
}
selectedJobs = make([]clijob.Job, 0, 1)
selectedJobs = append(selectedJobs, job)
return selectedJobs, nil
}