测试Sidekiq的重试队列

时间:2017-04-14 19:19:11

标签: ruby-on-rails ruby testing sidekiq minitest

我们有一个相当关键的任务组件,如果符合某些条件,它会清除某个项目的Sidekiq重试队列。 Sidekiq的测试API没有提供添加到重试队列的方法,所以我不得不想出一些自定义的东西。

1 个答案:

答案 0 :(得分:0)

要添加到重试队列:

  def add_retry(object: @object, klass: 'HardWorker', at: Time.now.to_f)
    payload = Sidekiq.dump_json(
      class: klass,
      args: [object.id, object.class, 'sidekiq_retry_test'],
      queue: 'user_integration',
      jid: rand(1..10000),
      retry_count: 20,
      failed_at: Time.now.to_f
    )

    Sidekiq.redis do |conn|
      conn.zadd('retry', at.to_s, payload)
    end
  end

您可以更改有效负载哈希内的任何内容。您可能希望指定队列,或添加更强大的解决方案来选择作业ID。这正是对我们有用的。

事后,您需要清理重试队列。您应该在teardownafter(:all)块中执行此操作。

  def cleanup_retry_queue
    Sidekiq::RetrySet.new.each do |job|
      job.delete if job.args[2] == 'sidekiq_retry_test'
    end
  end

请记住,这实际上会添加到队列中,所以要小心。如果您有可依赖重试队列的可测试组件,则仅使用此选项。不要用它来测试Sidekiq的排队功能本身。