Files
iotlcm/server/internal/library/worker/options.go
T
MiFaZhan 2ed5dfa6a1 chore: 初始开源发布
iotlcm-app:小程序端 + 用户端服务。

- app/:uni-app 小程序前端(基于 unibest,MIT)
  - 微信 AppID → YOUR_WX_APPID,uni-app AppID → __UNI__YOURAPPID
  - 内网后端地址 → admin.iotlcm.example.com
  - 应用标题与 unibest 模板 README 重写(保留上游致谢与 MIT 声明)
- server/:GoFrame 用户端服务(基于 XiuAdmin,Apache-2.0)
  - module xiuadmin → git.5iot.com/iotlcm-public/iotlcm-app(360 文件)
  - 支付回调地址 → app.iotlcm.example.com,商户名与应用名泛化
  - 真实手机号 → 合法 11 位编造号(保留号段前 3 位 + 后 4 位)
  - 依赖号码尾部的断言同步更新
  - 补 server/LICENSE(Apache-2.0)
- 移除内部资产:CI 触发器
- 补根 README,LF 行尾 + .gitattributes

已知:TestSysDept_RefreshDeptAncestors 在源仓同一提交上同样失败,属既有缺陷。
2026-10-26 14:01:25 +08:00

226 lines
6.2 KiB
Go

// Package worker
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package worker
import (
"context"
"time"
"github.com/gogf/gf/v2/frame/g"
)
type Payload struct {
IsAggregate bool `json:"isAggregate"`
Group string `json:"group"`
Uid string `json:"uid"`
Payload []byte `json:"payload"`
}
type AggregatorOptions struct {
GroupGracePeriod int // 组的优雅延迟时间(秒)
GroupMaxDelay int // 组的最大延迟时间(秒)
GroupMaxSize int // 组的最大大小
}
type WorkerOptions struct {
group string //任务处理器的组名
redisAddr string //redis地址
redisUser string //redis用户名
redisPassword string //redis密码
redisDB int //redis数据库
handler func(ctx context.Context, p Payload) error //任务处理函数
maxRetry int //任务最大重试次数
clearArchived int //清除已归档任务的时间间隔
timeout int //任务超时时间
redisPeriodKey string //redis周期任务键
aggregator *AggregatorOptions //聚合器选项
}
func GetDefaultWorkerOptions(ops *WorkerOptions) *WorkerOptions {
if ops != nil {
return ops
}
addr := g.Cfg().MustGet(context.Background(), "queue.asynq.redis.address").String()
pass := g.Cfg().MustGet(context.Background(), "queue.asynq.redis.pass").String()
db := g.Cfg().MustGet(context.Background(), "queue.asynq.redis.db").Int()
user := g.Cfg().MustGet(context.Background(), "queue.asynq.redis.user").String()
if user == "" {
user = "default"
}
return &WorkerOptions{
group: "task",
redisAddr: addr,
redisPassword: pass,
redisDB: db,
redisUser: user,
}
}
func WithWorkerGroup(group string) func(*WorkerOptions) {
return func(o *WorkerOptions) {
GetDefaultWorkerOptions(o).group = group
}
}
func WithWorkerRedisAddr(addr string) func(*WorkerOptions) {
return func(o *WorkerOptions) {
GetDefaultWorkerOptions(o).redisAddr = addr
}
}
func WithWorkerRedisUser(user string) func(*WorkerOptions) {
return func(o *WorkerOptions) {
GetDefaultWorkerOptions(o).redisUser = user
}
}
func WithWorkerRedisPassword(pass string) func(*WorkerOptions) {
return func(o *WorkerOptions) {
GetDefaultWorkerOptions(o).redisPassword = pass
}
}
func WithWorkerRedisDB(db int) func(*WorkerOptions) {
return func(o *WorkerOptions) {
GetDefaultWorkerOptions(o).redisDB = db
}
}
func WithWorkerHandler(handler func(ctx context.Context, p Payload) error) func(*WorkerOptions) {
return func(o *WorkerOptions) {
GetDefaultWorkerOptions(o).handler = handler
}
}
func WithWorkerMaxRetry(maxRetry int) func(*WorkerOptions) {
return func(o *WorkerOptions) {
GetDefaultWorkerOptions(o).maxRetry = maxRetry
}
}
func WithWorkerClearArchived(clearArchived int) func(*WorkerOptions) {
return func(o *WorkerOptions) {
GetDefaultWorkerOptions(o).clearArchived = clearArchived
}
}
func WithWorkerTimeout(timeout int) func(*WorkerOptions) {
return func(o *WorkerOptions) {
GetDefaultWorkerOptions(o).timeout = timeout
}
}
func WithWorkerRedisPeriodKey(redisPeriodKey string) func(*WorkerOptions) {
return func(o *WorkerOptions) {
GetDefaultWorkerOptions(o).redisPeriodKey = redisPeriodKey
}
}
func WithWorkerAggregator(aggregator *AggregatorOptions) func(*WorkerOptions) {
return func(o *WorkerOptions) {
GetDefaultWorkerOptions(o).aggregator = aggregator
}
}
type TaskOptions struct {
uid string
group string
payload []byte
expr string // 仅周期任务
in *time.Duration // 仅一次性任务 当前时间的延迟
at *time.Time // 仅一次性任务 指定时间
now bool // 仅一次性任务 当前时间
retention int // 仅一次性任务 任务保留时间 在这个时间内任务会被保留为已完成状态,过了这个时间后,任务将被自动删除。
replace bool // 仅一次性任务 是否替换已存在的任务
ctx context.Context // 仅一次性任务
maxRetry int
timeout int
}
func GetDefaultTaskOptions(opt *TaskOptions) *TaskOptions {
if opt != nil {
return opt
}
return &TaskOptions{
group: "group",
maxRetry: 3,
timeout: 120,
}
}
func WithTaskUid(uid string) func(*TaskOptions) {
return func(o *TaskOptions) {
GetDefaultTaskOptions(o).uid = uid
}
}
func WithTaskGroup(group string) func(*TaskOptions) {
return func(o *TaskOptions) {
GetDefaultTaskOptions(o).group = group
}
}
func WithTaskPayload(payload []byte) func(*TaskOptions) {
return func(o *TaskOptions) {
GetDefaultTaskOptions(o).payload = payload
}
}
func WithTaskExpr(expr string) func(*TaskOptions) {
return func(o *TaskOptions) {
GetDefaultTaskOptions(o).expr = expr
}
}
func WithTaskIn(in *time.Duration) func(*TaskOptions) {
return func(o *TaskOptions) {
GetDefaultTaskOptions(o).in = in
}
}
func WithTaskAt(at *time.Time) func(*TaskOptions) {
return func(o *TaskOptions) {
GetDefaultTaskOptions(o).at = at
}
}
func WithTaskNow(now bool) func(*TaskOptions) {
return func(o *TaskOptions) {
GetDefaultTaskOptions(o).now = now
}
}
func WithTaskRetention(retention int) func(*TaskOptions) {
return func(o *TaskOptions) {
GetDefaultTaskOptions(o).retention = retention
}
}
func WithTaskReplace(replace bool) func(*TaskOptions) {
return func(o *TaskOptions) {
GetDefaultTaskOptions(o).replace = replace
}
}
func WithTaskCtx(ctx context.Context) func(*TaskOptions) {
return func(o *TaskOptions) {
GetDefaultTaskOptions(o).ctx = ctx
}
}
func WithTaskMaxRetry(maxRetry int) func(*TaskOptions) {
return func(o *TaskOptions) {
GetDefaultTaskOptions(o).maxRetry = maxRetry
}
}
func WithTaskTimeout(timeout int) func(*TaskOptions) {
return func(o *TaskOptions) {
GetDefaultTaskOptions(o).timeout = timeout
}
}