【问题标题】:How to manually run a Sidekiq job如何手动运行 Sidekiq 作业
【发布时间】:2015-04-27 17:31:09
【问题描述】:

我有一个使用 Sidekiq 的应用程序。 Web 服务器进程有时会在 Sidekiq 上执行任务,但我不一定会让工作程序运行。有没有我可以从 Rails 控制台调用的实用程序,它可以从 Redis 队列中拉出一项工作并运行适当的 Sidekiq 工作程序?

【问题讨论】:

  • 当你知道的时候告诉我们

标签: ruby-on-rails-3 sidekiq


【解决方案1】:

这是一种您可能需要修改以获得所需工作的方法(可能像g8Msuggests above),但它应该可以解决问题:

> job = Sidekiq::Queue.new("your_queue").first
> job.klass.constantize.new.perform(*job.args)

如果要删除作业:

> job.delete

在 sidekiq 5.2.3 上测试。

【讨论】:

    【解决方案2】:

    我不会尝试破解 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
    

    如果这不起作用,或者如果有人知道更好的方法,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-18
      • 2014-06-03
      • 2017-01-08
      • 2014-12-05
      • 1970-01-01
      • 2012-10-29
      • 2013-07-22
      • 2017-09-07
      相关资源
      最近更新 更多