Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何从sidekiq队列中删除特定类别的作业?_Ruby_Redis_Sidekiq - Fatal编程技术网

Ruby 如何从sidekiq队列中删除特定类别的作业?

Ruby 如何从sidekiq队列中删除特定类别的作业?,ruby,redis,sidekiq,Ruby,Redis,Sidekiq,我不小心在Sidekiq把一堆工作排成了队列。我不想擦除我的整个Redis存储(并将所有Sidekiq数据和排队作业重置为零),但我想删除可以由给定类识别的所有排队作业。我该怎么做?在助手模块中尝试这样的方法,其中klass是工人类 def self.delete_jobs_for_worker(klass) jobs = Sidekiq::ScheduledSet.new jobs.select do |job| job.klass == 'Sidekiq::Extensi

我不小心在Sidekiq把一堆工作排成了队列。我不想擦除我的整个Redis存储(并将所有Sidekiq数据和排队作业重置为零),但我想删除可以由给定类识别的所有排队作业。我该怎么做?

在助手模块中尝试这样的方法,其中
klass
是工人类

 def self.delete_jobs_for_worker(klass)

  jobs = Sidekiq::ScheduledSet.new
  jobs.select do |job|
    job.klass == 'Sidekiq::Extensions::DelayedClass' &&
        ((job_klass, job_method, args) = YAML.load(job.args[0])) &&
        job_klass == klass 
  end.map(&:delete)

end
我发现提供了一种简单的方法来满足我的需要:

queue = Sidekiq::Queue.new(queue_name)
queue.each do |job|
    puts job.klass
    job.delete if job.klass == job_class
end

这些答案很有帮助,但对我来说并没有回答最初的问题。这些解决方案可能已经过时了

您必须访问作业的参数,并在循环范围内获取它的实际作业类。我尝试了上面的方法,但没有达到预期效果,因为
job.klass
不会返回您期望的结果

这是它当前在终端中返回的内容:

queue.each do |job|
  puts job.klass
end

ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper
=> nil
因此,我的解决方案是深入研究工作的论点,如下所示:

queue = Sidekiq::Queue.new(“job_queue_name”)

queue.each do |job|
  puts job.args.first['job_class']
  job.delete if job.args.first['job_class'] == "Things::DoesThatThingJob"
end
我相信有一种方法可以写得更优雅(也许是用精选的?) 但它是可读的。
希望我能够帮助像我这样正在寻找类似产品的人。

相关感谢您的提示!您提供的代码示例使我找到了我错过的文档页面,其中包含了我执行所需操作所需的信息。这看起来很棒,感谢您提供了有用的增强功能。我已经将此作为正式答案。很高兴我能够帮助@IvarI尝试了
jobs.args.first['job\u class']
,但没有成功@Ivar使用job.klass的回答很好。此外,根据Sidekiq API文档,job.klass应该是正确的解决方案。