如何在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,只有当没有活跃任务时才触发新作业。
- 新建一个调度控制作业:
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
- 修改
recurring.yml,改为调度这个控制作业:
# config/solid_queue/recurring.yml schedule_continuous_search_job: cron: "*/15 * * * *" class: "ScheduleContinuousSearchJob"
关键说明:
- 同时检查
pending和running状态,确保无论作业是在排队还是正在执行,都不会新增重复任务 - 这种方式从根源上避免了重复入队,减少不必要的队列操作
内容的提问来源于stack exchange,提问作者raj
相关产品推荐
相关产品推荐

