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() {//examplejobFuncs["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 -hUsage of ./myJob:-c stringconfig path-cfg stringjson config path (default "conf/config.json")-extended stringextended options, You can customize the options to bypass the flag.parse() restrictions-f foreground-m mock-mode intmode-p stringconfig path prefix with no trailing backslash-s stringstart or stop-usr1 stringuser defined flag -usr1-usr2 stringuser defined flag -usr2-usr3 stringuser defined flag -usr3-usr4 stringuser defined flag -usr4-usr5 stringuser defined flag -usr5-v version
其中Job管理器的默认把-extended作为解析对象,其值代表任务函数的标识。
选择任务testJob并执行
$./myJob -extended testJobtestJob[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],任务:testJobtestJobtestJobtestJobtestJobtestJobtestJobtestJobtestJobtestJob[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 mainimport ("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}
