package args import ( "quyun/v2/providers/job" . "github.com/riverqueue/river" "go.ipao.vip/atom/contracts" ) var _ contracts.JobArgs = MediaAssetProcessJob{} // MediaAssetProcessJob 表示“媒体资源处理”的一次性异步任务。 // // 设计说明: // - 该任务用于将 media_assets 从 processing 推进到 ready/failed(由 worker 执行核心处理逻辑)。 // - 幂等由 River Unique + 业务侧 DB 状态机共同保证(重复入队会被跳过或无副作用)。 type MediaAssetProcessJob struct { // TenantID 租户ID(用于多租户隔离与唯一性维度)。 TenantID int64 `json:"tenant_id" river:"unique"` // AssetID 媒体资源ID(用于唯一性维度)。 AssetID int64 `json:"asset_id" river:"unique"` } func (MediaAssetProcessJob) Kind() string { return "media_asset_process" } func (a MediaAssetProcessJob) UniqueID() string { return a.Kind() } func (MediaAssetProcessJob) InsertOpts() InsertOpts { return InsertOpts{ Queue: job.QueueDefault, Priority: job.PriorityDefault, // 失败可重试;由 worker 判断不可重试的场景并 JobCancel。 MaxAttempts: 10, UniqueOpts: UniqueOpts{ ByArgs: true, }, } }