Cloudreve/pkg/queue/options.go

110 lines
2.3 KiB
Go

package queue
import (
"runtime"
"time"
)
// An Option configures a mutex.
type Option interface {
apply(*options)
}
// OptionFunc is a function that configures a queue.
type OptionFunc func(*options)
// Apply calls f(option)
func (f OptionFunc) apply(option *options) {
f(option)
}
type options struct {
maxTaskExecution time.Duration // Maximum execution time for a Task.
retryDelay time.Duration
taskPullInterval time.Duration
backoffFactor float64
backoffMaxDuration time.Duration
maxRetry int
resumeTaskType []string
workerCount int
name string
}
func newDefaultOptions() *options {
return &options{
workerCount: runtime.NumCPU(),
maxTaskExecution: 60 * time.Hour,
backoffFactor: 2,
backoffMaxDuration: 60 * time.Second,
resumeTaskType: []string{},
taskPullInterval: 1 * time.Second,
name: "default",
}
}
// WithMaxTaskExecution set maximum execution time for a Task.
func WithMaxTaskExecution(d time.Duration) Option {
return OptionFunc(func(q *options) {
q.maxTaskExecution = d
})
}
// WithRetryDelay set retry delay
func WithRetryDelay(d time.Duration) Option {
return OptionFunc(func(q *options) {
q.retryDelay = d
})
}
// WithBackoffFactor set backoff factor
func WithBackoffFactor(f float64) Option {
return OptionFunc(func(q *options) {
q.backoffFactor = f
})
}
// WithBackoffMaxDuration set backoff max duration
func WithBackoffMaxDuration(d time.Duration) Option {
return OptionFunc(func(q *options) {
q.backoffMaxDuration = d
})
}
// WithMaxRetry set max retry
func WithMaxRetry(n int) Option {
return OptionFunc(func(q *options) {
q.maxRetry = n
})
}
// WithResumeTaskType set resume Task type
func WithResumeTaskType(types ...string) Option {
return OptionFunc(func(q *options) {
q.resumeTaskType = types
})
}
// WithWorkerCount set worker count
func WithWorkerCount(num int) Option {
return OptionFunc(func(q *options) {
if num <= 0 {
num = runtime.NumCPU()
}
q.workerCount = num
})
}
// WithName set queue name
func WithName(name string) Option {
return OptionFunc(func(q *options) {
q.name = name
})
}
// WithTaskPullInterval set task pull interval
func WithTaskPullInterval(d time.Duration) Option {
return OptionFunc(func(q *options) {
q.taskPullInterval = d
})
}