【发布时间】:2015-04-27 17:31:09
【问题描述】:
我有一个使用 Sidekiq 的应用程序。 Web 服务器进程有时会在 Sidekiq 上执行任务,但我不一定会让工作程序运行。有没有我可以从 Rails 控制台调用的实用程序,它可以从 Redis 队列中拉出一项工作并运行适当的 Sidekiq 工作程序?
【问题讨论】:
-
当你知道的时候告诉我们
我有一个使用 Sidekiq 的应用程序。 Web 服务器进程有时会在 Sidekiq 上执行任务,但我不一定会让工作程序运行。有没有我可以从 Rails 控制台调用的实用程序,它可以从 Redis 队列中拉出一项工作并运行适当的 Sidekiq 工作程序?
【问题讨论】:
这是一种您可能需要修改以获得所需工作的方法(可能像g8Msuggests above),但它应该可以解决问题:
> job = Sidekiq::Queue.new("your_queue").first
> job.klass.constantize.new.perform(*job.args)
如果要删除作业:
> job.delete
在 sidekiq 5.2.3 上测试。
【讨论】:
我不会尝试破解 sidekiq 的 API 来手动运行作业,因为它可能会留下一些不需要的内部状态,但我相信以下代码会起作用
# Fetch the Queue
queue = Sidekiq::Queue.new # default queue
# OR
# queue = Sidekiq::Queue.new(:my_queue_name)
# Fetch the job
# job = queue.first
# OR
job = queue.find do |job|
meta = job.args.first
# => {"job_class" => "MyJob", "job_id"=>"1afe424a-f878-44f2-af1e-e299faee7e7f", "queue_name"=>"my_queue_name", "arguments"=>["Arg1", "Arg2", ...]}
meta['job_class'] == 'MyJob' && meta['arguments'].first == 'Arg1'
end
# Removes from queue so it doesn't get processed twice
job.delete
meta = job.args.first
klass = meta['job_class'].constantize
# => MyJob
# Performs the job without using Sidekiq's API, does not count as performed job and so on.
klass.new.perform(*meta['arguments'])
# OR
# Perform the job using Sidekiq's API so it counts as performed job and so on.
# klass.new(*meta['arguments']).perform_now
如果这不起作用,或者如果有人知道更好的方法,请告诉我。
【讨论】: