xxj-job是一个Java实现的轻量级分布式任务调度平台,具体实现与使用请参考https://github.com/xuxueli/xxl-job,原版执行器亦要求Java平台,但公司部分项目是golang开发,所以自己实现了go版本的执行器。
- 我所实现的go客户端执行器rpc通信采用dubbo-go所用的类型Java netty的自研通信框架getty(请参考:https://github.com/dubbogo/getty).
- 整个设计实现是参考xxl-job-core的源码实现了go版本,核心在于admin与执行器的rpc通讯采用的序列化方式是hessian2,所有借用了apache实现的dubbo-go-hessian2(参考https://github.com/apache/dubbo-go-hessian2)。
- 支持了shell, python, php, js, powershell,暂不支持动态编译的groovy模式。
- 脚本模式的分片参数会作为启动脚本时的最后两个参数,用户参数按顺序位于分片参数之前。
详细步骤请参考https://github.com/xuxueli/xxl-job, 此处不再描述admin的部署。
go get github.com/tangjun2012/go-xxl-job-client.git
func XxlJobTest(ctx context.Context) error {
logger.Info(ctx, "golang job run success >>>>>>>>>>>>>>")
logger.Info(ctx, "the input param:", xxl.GetParam(ctx, "name"))
return nil
}
client := xxl.NewXxlClient(
option.WithAppName("go-example"),
option.WithClientPort(8083),
) //构建客户端
client.RegisterJob("testJob", JobTest) //注册任务
client.Run() //启动客户端
- 构建客户端时的appName是xxl-job-admin后台添加执行器时的name
- 注册任务时的名字是xxl-job-admin后台新增任务时的JobHandler
- appName为客户注册执行器时的名字
- 注册方式选择自动注册
- JobHandler为注册任务时的name
- 执行器选择刚刚添加的执行器
- 运行模式默认BEAN模式,可选择其他脚本模式(不支持GLUE(Java))
- go-xxl-job-client自己实现了日志输出,使用github.com/tangjun2012/go-xxl-job-client/logger包输出日志,因为golang不支持像Java的ThreadLocal一样的线程变量,已无法获取到golang的协程id,所以日志输出依赖的内容已存到context上下文遍历中,故log需要使用context变量。可参考任务配置中的日志输出,
logger.Info(ctx, "golang job run success >>>>>>>>>>>>>>")
- 任务参数传递,可使用xxl.GetParam获取到任务配置或执行时手动添加的参数,使用xxl.GetSharding获取到分片参数。
param, _ := xxl.GetParam(ctx, "name") //获取输入参数
logger.Info(ctx, "the input param:", param)
shardingIdx, shardingTotal := xxl.GetSharding(ctx) //获取分片参数
logger.Info(ctx, "the sharding param: idx:", shardingIdx, ", total:", shardingTotal)
在调度日志中点击执行日志查看任务执行日志。