summaryrefslogtreecommitdiffstats
path: root/model/scheduled_task.go
diff options
context:
space:
mode:
authorHarrison Healey <harrisonmhealey@gmail.com>2017-05-18 15:05:57 -0400
committerGitHub <noreply@github.com>2017-05-18 15:05:57 -0400
commit577ed27f1bb060080d311342047e31943a02ccbb (patch)
treead57fa69b1daf143e914ea2480a475e5450cc236 /model/scheduled_task.go
parent920bc0d8712a50691b1f698779f60132536eb214 (diff)
downloadchat-577ed27f1bb060080d311342047e31943a02ccbb.tar.gz
chat-577ed27f1bb060080d311342047e31943a02ccbb.tar.bz2
chat-577ed27f1bb060080d311342047e31943a02ccbb.zip
PLT-6408 Framework for job server (#6404)
* Added initial job server * Added job server to be ran as part of platform * Added test job to the enterprise repo * Fixed job server not loading license * Renamed job package to jobs * Fixed TE not being buildable * Added JobStatus table to database * Changed fields used by JobStatus * Added APIs to query job status * Added config change listener to server * Added option to run job server from Makefile * Added ability to enable/disable jobs from config * Commented out placeholder for search indexing job * Fixed govet * Removed debug messages and fixed job api init message
Diffstat (limited to 'model/scheduled_task.go')
-rw-r--r--model/scheduled_task.go110
1 files changed, 110 insertions, 0 deletions
diff --git a/model/scheduled_task.go b/model/scheduled_task.go
new file mode 100644
index 000000000..453828bd2
--- /dev/null
+++ b/model/scheduled_task.go
@@ -0,0 +1,110 @@
+// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+package model
+
+import (
+ "fmt"
+ "sync"
+ "time"
+)
+
+type TaskFunc func()
+
+type ScheduledTask struct {
+ Name string `json:"name"`
+ Interval time.Duration `json:"interval"`
+ Recurring bool `json:"recurring"`
+ function TaskFunc
+ timer *time.Timer
+}
+
+var taskMutex = sync.Mutex{}
+var tasks = make(map[string]*ScheduledTask)
+
+func addTask(task *ScheduledTask) {
+ taskMutex.Lock()
+ defer taskMutex.Unlock()
+ tasks[task.Name] = task
+}
+
+func removeTaskByName(name string) {
+ taskMutex.Lock()
+ defer taskMutex.Unlock()
+ delete(tasks, name)
+}
+
+func GetTaskByName(name string) *ScheduledTask {
+ taskMutex.Lock()
+ defer taskMutex.Unlock()
+ if task, ok := tasks[name]; ok {
+ return task
+ }
+ return nil
+}
+
+func GetAllTasks() *map[string]*ScheduledTask {
+ taskMutex.Lock()
+ defer taskMutex.Unlock()
+ return &tasks
+}
+
+func CreateTask(name string, function TaskFunc, timeToExecution time.Duration) *ScheduledTask {
+ task := &ScheduledTask{
+ Name: name,
+ Interval: timeToExecution,
+ Recurring: false,
+ function: function,
+ }
+
+ taskRunner := func() {
+ go task.function()
+ removeTaskByName(task.Name)
+ }
+
+ task.timer = time.AfterFunc(timeToExecution, taskRunner)
+
+ addTask(task)
+
+ return task
+}
+
+func CreateRecurringTask(name string, function TaskFunc, interval time.Duration) *ScheduledTask {
+ task := &ScheduledTask{
+ Name: name,
+ Interval: interval,
+ Recurring: true,
+ function: function,
+ }
+
+ taskRecurer := func() {
+ go task.function()
+ task.timer.Reset(task.Interval)
+ }
+
+ task.timer = time.AfterFunc(interval, taskRecurer)
+
+ addTask(task)
+
+ return task
+}
+
+func (task *ScheduledTask) Cancel() {
+ task.timer.Stop()
+ removeTaskByName(task.Name)
+}
+
+// Executes the task immediatly. A recurring task will be run regularally after interval.
+func (task *ScheduledTask) Execute() {
+ task.function()
+ task.timer.Reset(task.Interval)
+}
+
+func (task *ScheduledTask) String() string {
+ return fmt.Sprintf(
+ "%s\nInterval: %s\nRecurring: %t\n",
+ task.Name,
+ task.Interval.String(),
+ task.Recurring,
+ )
+}