Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
1.9 KiB
94 lines
1.9 KiB
// Copyright 2014 The Gogs Authors. All rights reserved. |
|
// Copyright 2019 The Gitea Authors. All rights reserved. |
|
// Use of this source code is governed by a MIT-style |
|
// license that can be found in the LICENSE file. |
|
|
|
package cron |
|
|
|
import ( |
|
"context" |
|
"time" |
|
|
|
"code.gitea.io/gitea/modules/graceful" |
|
"code.gitea.io/gitea/modules/sync" |
|
|
|
"github.com/gogs/cron" |
|
) |
|
|
|
var c = cron.New() |
|
|
|
// Prevent duplicate running tasks. |
|
var taskStatusTable = sync.NewStatusTable() |
|
|
|
// NewContext begins cron tasks |
|
// Each cron task is run within the shutdown context as a running server |
|
// AtShutdown the cron server is stopped |
|
func NewContext() { |
|
initBasicTasks() |
|
initExtendedTasks() |
|
|
|
lock.Lock() |
|
for _, task := range tasks { |
|
if task.IsEnabled() && task.DoRunAtStart() { |
|
go task.Run() |
|
} |
|
} |
|
|
|
c.Start() |
|
started = true |
|
lock.Unlock() |
|
graceful.GetManager().RunAtShutdown(context.Background(), func() { |
|
c.Stop() |
|
lock.Lock() |
|
started = false |
|
lock.Unlock() |
|
}) |
|
|
|
} |
|
|
|
// TaskTableRow represents a task row in the tasks table |
|
type TaskTableRow struct { |
|
Name string |
|
Spec string |
|
Next time.Time |
|
Prev time.Time |
|
ExecTimes int64 |
|
} |
|
|
|
// TaskTable represents a table of tasks |
|
type TaskTable []*TaskTableRow |
|
|
|
// ListTasks returns all running cron tasks. |
|
func ListTasks() TaskTable { |
|
entries := c.Entries() |
|
eMap := map[string]*cron.Entry{} |
|
for _, e := range entries { |
|
eMap[e.Description] = e |
|
} |
|
lock.Lock() |
|
defer lock.Unlock() |
|
tTable := make([]*TaskTableRow, 0, len(tasks)) |
|
for _, task := range tasks { |
|
spec := "-" |
|
var ( |
|
next time.Time |
|
prev time.Time |
|
) |
|
if e, ok := eMap[task.Name]; ok { |
|
spec = e.Spec |
|
next = e.Next |
|
prev = e.Prev |
|
} |
|
task.lock.Lock() |
|
tTable = append(tTable, &TaskTableRow{ |
|
Name: task.Name, |
|
Spec: spec, |
|
Next: next, |
|
Prev: prev, |
|
ExecTimes: task.ExecTimes, |
|
}) |
|
task.lock.Unlock() |
|
} |
|
|
|
return tTable |
|
}
|
|
|