4 Star 6 Fork 4

王军/golib

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
init.go 4.43 KB
一键复制 编辑 原始数据 按行查看 历史
王军 提交于 2025-05-16 10:00 +08:00 . 删除无用信息
package taskjs
import (
"bytes"
"errors"
"os"
"strconv"
"strings"
"gitee.com/haodreams/golib/logs"
"github.com/dop251/goja"
"github.com/robfig/cron/v3"
)
//InitSyncJs 初始化同步的任务
/**
* @description:
* @param {string} path
* @param {func} initFunc 并发执行时,重新初始化脚本时的回调初始化函数
* @return {*}
*/
func InitCronJs(path string) {
if boss == nil {
boss = new(Boss)
}
tasks := loadJsFile(path, "cron.csv", false)
array := make([]*Task, 0)
kv := map[string]*Tasks{}
for _, task := range tasks {
if ts, ok := kv[task.Time]; ok {
ts.tasks = append(ts.tasks, task)
} else {
ts = new(Tasks)
ts.Time = task.Time
ts.tasks = append(ts.tasks, task)
kv[task.Time] = ts
}
array = append(array, task)
}
job := new(CronTask)
job.array = array
job.taskMap = kv
job.cron = cron.New(cron.WithSeconds())
boss.Job = job
for _, tasks := range kv {
if tasks.Time == "init" {
go tasks.Run()
continue
}
id, err := job.cron.AddJob(tasks.Time, tasks)
if err != nil {
logs.Error(err.Error())
continue
}
tasks.ID = int(id)
}
job.cron.Start()
}
//InitSyncJs 初始化同步的任务
/**
* @description:
* @param {string} path
* @param {func} initFunc 并发执行时,重新初始化脚本时的回调初始化函数
* @return {*}
*/
func InitSyncJs(path string) {
if boss == nil {
boss = new(Boss)
}
tasks := loadJsFile(path, "sync.csv", true)
array := make([]*Task, 0)
kv := map[string]*Tasks{}
for _, task := range tasks {
if ts, ok := kv[task.Time]; ok {
ts.tasks = append(ts.tasks, task)
} else {
ts = new(Tasks)
ts.Time = task.Time
ts.tasks = append(ts.tasks, task)
kv[task.Time] = ts
}
array = append(array, task)
}
job := new(SyncTask)
job.array = array
job.taskMap = kv
job.cron = cron.New(cron.WithSeconds())
boss.Job = job
for _, tasks := range kv {
if tasks.Time == "init" {
go tasks.Run()
continue
}
for _, task := range tasks.tasks {
task.ready = true
}
id, err := job.cron.AddJob(tasks.Time, tasks)
if err != nil {
logs.Error(err.Error())
continue
}
tasks.ID = int(id)
}
job.cron.Start()
}
// InitAsynJs 初始化异步任务
func InitAsynJs(path string) {
if boss == nil {
boss = new(Boss)
}
tasks := loadJsFile(path, "async.csv", true)
job := new(AsyncTask)
job.tasks = tasks // append(job.tasks, tasks...)
job.cron = cron.New(cron.WithSeconds()) //
boss.Job = job
for _, task := range tasks {
if task.Time == "init" {
go task.Run()
continue
}
task.ready = true
id, err := job.cron.AddJob(task.Time, task)
if err != nil {
logs.Error(err.Error())
continue
}
task.ID = int(id)
}
job.cron.Start()
}
// loadJsFile 初始化js
// @param {string} path 路径
// @param {string} fileName 文件名
// @param {bool} initd 是否初始化
// @return {*}
func loadJsFile(path string, fileName string, initd bool) (tasks []*Task) {
data, err := os.ReadFile(path + fileName)
if err != nil {
return
}
buf := bytes.NewBuffer(data)
for line, err := buf.ReadString('\n'); err == nil || len(line) > 0; line, err = buf.ReadString('\n') {
line = strings.TrimSpace(line)
if line == "" {
continue
}
if line[0] == '#' {
continue
}
//time,lua,desc,timeout
ss := strings.Split(line, ",")
for i := range ss {
ss[i] = strings.TrimSpace(ss[i])
}
if len(ss) < 2 {
continue
}
task := new(Task)
task.Time = ss[0]
task.initd = initd
//是关键字段
task.Time = strings.ReplaceAll(task.Time, "|", ",")
task.Path = path + ss[1]
if len(ss) > 2 {
task.Desc = ss[2]
}
if len(ss) > 3 {
task.Timeout, _ = strconv.ParseInt(ss[3], 10, 64)
}
if initd {
vm, err := LoadJs(task.Path)
if err != nil {
logs.Warn(err)
task.err = err
task.Msg = err.Error()
tasks = append(tasks, task)
continue
}
setup, ok := goja.AssertFunction(vm.Get("setup"))
if ok {
task.setup = setup
}
run, ok := goja.AssertFunction(vm.Get("run"))
if !ok {
task.err = errors.New("run() not a function")
task.Msg = task.err.Error()
logs.Warn(task.Msg)
continue
}
task.run = run
task.vm = vm
task.Msg = "等待初始化完成"
}
tasks = append(tasks, task)
}
return
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/haodreams/golib.git
git@gitee.com:haodreams/golib.git
haodreams
golib
golib
v1.0.0

搜索帮助