代码拉取完成,页面将自动刷新
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
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。