mirror of https://github.com/cloudreve/Cloudreve
110 lines
2.3 KiB
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
|
|
})
|
|
}
|