package rolesync import ( "context" "encoding/json" "fmt" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "git.5iot.com/iotlcm-public/iotlcm-worker-svr/internal/consts" "git.5iot.com/iotlcm-public/iotlcm-worker-svr/internal/library/rabbitmq" "git.5iot.com/iotlcm-public/iotlcm-worker-svr/internal/model" "strings" "time" ) func Start(ctx context.Context) (func(), error) { if !g.Cfg().MustGet(ctx, "roleSync.enabled", false).Bool() { return func() {}, nil } if !rabbitmq.Enabled(ctx) { return nil, gerror.New("权限同步 Worker 必须启用 RabbitMQ 并配置连接") } workerCtx, cancel := context.WithCancel(ctx) go superviseConsumer(workerCtx) g.Log().Info(ctx, "role sync Worker started") return cancel, nil } func handleMessage(ctx context.Context, message model.AgentRoleSyncMessage) error { if err := syncRoleMessage(ctx, &message); err != nil { g.Log().Errorf(ctx, "role sync failed, taskId:%s, roleId:%d, attempt:%d, err:%+v", message.TaskId, message.SourceRoleId, message.RetryCount, err) message.RetryCount++ body, marshalErr := json.Marshal(message) if marshalErr != nil { return marshalErr } if message.RetryCount > 5 { deadLetter, marshalErr := json.Marshal(model.AgentRoleSyncDeadLetterMessage{ Message: message, Error: err.Error(), FailedAt: time.Now().Format(time.RFC3339), }) if marshalErr != nil { return marshalErr } return publishRoleDeadLetter(ctx, deadLetter) } delay := time.Duration(1<