github.com/adacta-ru/mattermost-server/v5@v5.31.1/jobs/expirynotify/worker.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package expirynotify
     5  
     6  import (
     7  	"github.com/adacta-ru/mattermost-server/v5/app"
     8  	"github.com/adacta-ru/mattermost-server/v5/jobs"
     9  	"github.com/adacta-ru/mattermost-server/v5/mlog"
    10  	"github.com/adacta-ru/mattermost-server/v5/model"
    11  )
    12  
    13  const (
    14  	JobName = "ExpiryNotify"
    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 *ExpiryNotifyJobInterfaceImpl) 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.NotifySessionsExpired(); err != nil {
    80  		mlog.Error("Worker: Failed to notify clients of expired session", 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  }