Skip to content
Snippets Groups Projects
Select Git revision
  • 3b16eddfed22bcca91d088d34c94df29303f3c2e
  • main default protected
  • drip-server-timing
  • compress-middleware
  • v2.11.0
  • v2.10.0
  • v2.9.2
  • v2.9.1
  • v2.9.0
  • v2.8.0
  • v2.7.0
  • v2.6.0
  • v2.5.6
  • v2.5.5
  • v2.5.4
  • v2.5.3
  • v2.5.2
  • v2.5.1
  • v2.5.0
  • v2.4.2
  • v2.4.1
  • v2.4.0
  • v2.3.0
  • v2.2.2
24 results

assets.go

Blame
  • schedule-cron.go 1.52 KiB
    // Copyright 2023 schukai GmbH
    // SPDX-License-Identifier: AGPL-3.0
    
    package jobqueue
    
    import (
    	"fmt"
    	"github.com/robfig/cron/v3"
    )
    
    // CronScheduler is a scheduler that uses the cron library to schedule jobs
    type CronScheduler struct {
    	cron *cron.Cron
    	Spec string
    	jobs map[JobID]cron.EntryID
    }
    
    func (s *CronScheduler) Schedule(job GenericJob, eventBus *EventBus) error {
    	var err error
    
    	if s.cron == nil {
    		return ErrCronNotInitialized
    	}
    
    	if s.jobs == nil {
    		s.jobs = make(map[JobID]cron.EntryID)
    	}
    
    	id := job.GetID()
    	if _, ok := s.jobs[id]; ok {
    		return fmt.Errorf("%w: job %s already scheduled", ErrJobAlreadyScheduled, id)
    	}
    
    	entryId, err := s.cron.AddFunc(s.Spec, func() {
    		if !job.IsPaused() {
    			eventBus.Publish(QueueJob, job)
    		}
    	})
    
    	s.jobs[id] = entryId
    
    	if err != nil {
    		return err
    	}
    
    	return nil
    }
    
    func (s *CronScheduler) GetType() string {
    	return "Cron"
    }
    
    func (s *CronScheduler) IsAdHoc() bool {
    	return false
    }
    
    func (s *CronScheduler) Cancel(id JobID) error {
    
    	if s.jobs == nil {
    		return nil
    	}
    
    	if entryId, ok := s.jobs[id]; ok {
    		s.cron.Remove(entryId)
    	}
    
    	return nil
    }
    
    func (s *CronScheduler) CancelAll() error {
    	if s.jobs == nil {
    		return nil
    	}
    
    	for _, entryId := range s.jobs {
    		s.cron.Remove(entryId)
    	}
    
    	s.jobs = nil
    	return nil
    }
    
    func (s *CronScheduler) JobExists(id JobID) bool {
    	if s.jobs == nil {
    		return false
    	}
    
    	_, ok := s.jobs[id]
    	return ok
    }
    
    func (s *CronScheduler) GetPersistence() SchedulerPersistence {
    	return SchedulerPersistence{
    		Type: s.GetType(),
    		Spec: s.Spec,
    	}
    }