You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rails的Solid Queue中丢弃重复的ContinuousSearchJob

解决Solid Queue中重复调度作业的问题

针对你遇到的ContinuousSearchJob因执行超时导致重复入队的问题,这里提供两种可行的解决方案:

方案一:作业执行后清理待处理的同类型作业

在作业执行完成后,直接查询并丢弃队列中所有待处理的ContinuousSearchJob,确保队列中不会堆积重复任务。

class ContinuousSearchJob < ApplicationJob
  queue_as :default

  def perform
    keyword = Keyword.first
    keyword.insert_playlists if keyword

    # 清理所有待处理的同类型作业
    SolidQueue::Job.where(class_name: "ContinuousSearchJob", status: "pending").find_each do |job|
      job.discard
    end
  end
end

关键说明:

  • Solid Queue的作业模型是SolidQueue::Job,而非你之前写的SolidQueue
  • 筛选条件中用class_name字段匹配作业类名,注意要写全类名"ContinuousSearchJob"
  • status: "pending"定位所有待处理的作业,调用discard方法标记为已丢弃

方案二:调度前检查,从源头避免重复入队(更优)

比起事后清理,更高效的方式是在调度时先检查是否已有运行中或待处理的ContinuousSearchJob,只有当没有活跃任务时才触发新作业。

  1. 新建一个调度控制作业:
class ScheduleContinuousSearchJob < ApplicationJob
  def perform
    # 检查是否存在活跃的同类型作业(运行中/待处理)
    has_active_job = SolidQueue::Job.where(class_name: "ContinuousSearchJob")
                                    .where(status: ["pending", "running"])
                                    .exists?

    # 没有活跃任务才触发作业
    ContinuousSearchJob.perform_later unless has_active_job
  end
end
  1. 修改recurring.yml,改为调度这个控制作业:
# config/solid_queue/recurring.yml
schedule_continuous_search_job:
  cron: "*/15 * * * *"
  class: "ScheduleContinuousSearchJob"

关键说明:

  • 同时检查pending和running状态,确保无论作业是在排队还是正在执行,都不会新增重复任务
  • 这种方式从根源上避免了重复入队,减少不必要的队列操作

内容的提问来源于stack exchange,提问作者raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:02:01