Select Git revision
jobs.go 4.32 KiB
package jobqueue
import (
"sync"
"time"
)
type JobsInterface interface {
GetJobs() map[JobIDType]ReadOnlyJob
GetExecutableJobs() map[JobIDType]ReadOnlyJob
AddJob(jobSpec JobSpecification, runnable Runnable) error
RemoveJob(id JobIDType) (bool, error)
GetJobStatus(id JobIDType) (JobStatus, error)
Cleanup()
GetFinishedJobs() map[JobIDType]ReadOnlyJob
GetFinishedJob(id JobIDType) ReadOnlyJob
RemoveFinishedJob(id JobIDType) (bool, error)
JobExists(id JobIDType) bool
GetJob(id JobIDType) ReadOnlyJob
GetJobsCount() int
}
type jobs struct {
jobs map[JobIDType]*job
finishedJobs map[JobIDType]*job
mutex sync.Mutex
}
// compile time check if jobs implements JobsInterface
var _ JobsInterface = (*jobs)(nil)
func (jq *jobs) GetJobsCount() int {
jq.mutex.Lock()
defer jq.mutex.Unlock()
return len(jq.jobs)
}
func (jq *jobs) Cleanup() {
jq.mutex.Lock()
defer jq.mutex.Unlock()
for id, job := range jq.jobs {
if job.Status == JobFinished {
jq.finishedJobs[id] = job
delete(jq.jobs, id)
}
}
}
func (jq *jobs) GetFinishedJobs() map[JobIDType]ReadOnlyJob {
jq.mutex.Lock()
defer jq.mutex.Unlock()
jobs := make(map[JobIDType]ReadOnlyJob)
for id, job := range jq.finishedJobs {
jobs[id] = job // Implizites Casting zu ReadOnlyJob
}