github.com/mattermost/mattermost-server/v5@v5.39.3/jobs/product_notices/worker.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package product_notices 5 6 import ( 7 "github.com/mattermost/mattermost-server/v5/app" 8 "github.com/mattermost/mattermost-server/v5/jobs" 9 "github.com/mattermost/mattermost-server/v5/model" 10 "github.com/mattermost/mattermost-server/v5/shared/mlog" 11 ) 12 13 const ( 14 JobName = "ProductNotices" 15 ) 16 17 type Worker struct { 18 name string 19 stop chan bool 20 stopped chan bool 21 jobs chan model.Job 22 jobServer *jobs.JobServer 23 app *app.App 24 } 25 26 func (m *ProductNoticesJobInterfaceImpl) MakeWorker() model.Worker { 27 worker := Worker{ 28 name: JobName, 29 stop: make(chan bool, 1), 30 stopped: make(chan bool, 1), 31 jobs: make(chan model.Job), 32 jobServer: m.App.Srv().Jobs, 33 app: m.App, 34 } 35 return &worker 36 } 37 38 func (worker *Worker) Run() { 39 mlog.Debug("Worker started", mlog.String("worker", worker.name)) 40 41 defer func() { 42 mlog.Debug("Worker finished", mlog.String("worker", worker.name)) 43 worker.stopped <- true 44 }() 45 46 for { 47 select { 48 case <-worker.stop: 49 mlog.Debug("Worker received stop signal", mlog.String("worker", worker.name)) 50 return 51 case job := <-worker.jobs: 52 mlog.Debug("Worker received a new candidate job.", mlog.String("worker", worker.name)) 53 worker.DoJob(&job) 54 } 55 } 56 } 57 58 func (worker *Worker) Stop() { 59 mlog.Debug("Worker stopping", mlog.String("worker", worker.name)) 60 worker.stop <- true 61 <-worker.stopped 62 } 63 64 func (worker *Worker) JobChannel() chan<- model.Job { 65 return worker.jobs 66 } 67 68 func (worker *Worker) DoJob(job *model.Job) { 69 if claimed, err := worker.jobServer.ClaimJob(job); err != nil { 70 mlog.Warn("Worker experienced an error while trying to claim job", 71 mlog.String("worker", worker.name), 72 mlog.String("job_id", job.Id), 73 mlog.String("error", err.Error())) 74 return 75 } else if !claimed { 76 return 77 } 78 79 if err := worker.app.UpdateProductNotices(); err != nil { 80 mlog.Error("Worker: Failed to fetch product notices", mlog.String("worker", worker.name), mlog.String("job_id", job.Id), mlog.String("error", err.Error())) 81 worker.setJobError(job, err) 82 return 83 } 84 85 mlog.Info("Worker: Job is complete", mlog.String("worker", worker.name), mlog.String("job_id", job.Id)) 86 worker.setJobSuccess(job) 87 } 88 89 func (worker *Worker) setJobSuccess(job *model.Job) { 90 if err := worker.app.Srv().Jobs.SetJobSuccess(job); err != nil { 91 mlog.Error("Worker: Failed to set success for job", mlog.String("worker", worker.name), mlog.String("job_id", job.Id), mlog.String("error", err.Error())) 92 worker.setJobError(job, err) 93 } 94 } 95 96 func (worker *Worker) setJobError(job *model.Job, appError *model.AppError) { 97 if err := worker.app.Srv().Jobs.SetJobError(job, appError); err != nil { 98 mlog.Error("Worker: Failed to set job error", mlog.String("worker", worker.name), mlog.String("job_id", job.Id), mlog.String("error", err.Error())) 99 } 100 }