42 lines
1.5 KiB
Go
42 lines
1.5 KiB
Go
package task
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/bytedance/sonic"
|
|
"github.com/hibiken/asynq"
|
|
"go.uber.org/zap"
|
|
|
|
cardapp "github.com/break/junhong_cmp_fiber/internal/application/cardobservation"
|
|
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
|
)
|
|
|
|
// CardObservationSeriesHandler 处理固定零重试的卡观测序列尝试。
|
|
type CardObservationSeriesHandler struct {
|
|
service *cardapp.SeriesAttemptService
|
|
logger *zap.Logger
|
|
}
|
|
|
|
// NewCardObservationSeriesHandler 创建卡观测序列任务处理器。
|
|
func NewCardObservationSeriesHandler(service *cardapp.SeriesAttemptService, logger *zap.Logger) *CardObservationSeriesHandler {
|
|
return &CardObservationSeriesHandler{service: service, logger: logger}
|
|
}
|
|
|
|
// Handle 解析结构化载荷并执行单次观测。
|
|
func (h *CardObservationSeriesHandler) Handle(ctx context.Context, task *asynq.Task) error {
|
|
if h == nil || h.service == nil {
|
|
return errors.New(errors.CodeInternalError, "卡观测序列任务服务未配置")
|
|
}
|
|
var payload cardapp.SeriesTaskPayload
|
|
if err := sonic.Unmarshal(task.Payload(), &payload); err != nil {
|
|
h.logger.Error("解析卡观测序列任务载荷失败", zap.Error(err))
|
|
return errors.Wrap(errors.CodeInvalidParam, err, "卡观测序列任务载荷无法解析")
|
|
}
|
|
if err := h.service.Execute(ctx, payload); err != nil {
|
|
h.logger.Warn("卡观测序列当前尝试失败",
|
|
zap.String("series_id", payload.SeriesID), zap.Int("attempt", payload.Attempt), zap.Error(err))
|
|
return err
|
|
}
|
|
return nil
|
|
}
|