标签: resque-retry

如何在resque-retry和Rails 4中测试重试和失败?

我正在尝试编写一个测试resque-retry的重试功能的规范,我似乎无法让测试正确地命中binding.pry.有没有办法使用rspec 3测试此功能,以便我可以验证它们是否按预期运行?

这是一个请求规范,我试图通过fixtures模拟一个实时请求,但无论我尝试什么,我似乎无法得到重试的工作.

gem 'resque', require: 'resque/server'
gem 'resque-web', require: 'resque_web'
gem 'resque-scheduler'
gem 'resque-retry'
gem 'resque-lock-timeout'
Run Code Online (Sandbox Code Playgroud)

我正在使用resque_rspec,并尝试此测试策略.

部分规格

it 'retries it' do
  stub_request(:any, /.*api.bigcartel.*/).to_return(body: '{}', status: 200)
  @order_shipped_json['order']['originator_id'] = @provider_order
  post "/hook/shops/#{@shop.id}", @order_shipped_json.to_json, format: :json
  ResqueSpec.perform_all(queue_name)
  ???
end
Run Code Online (Sandbox Code Playgroud)

队列工作

class QueueHook
  extend Resque::Plugins::LockTimeout
  extend Resque::Plugins::Retry
  extend QueueLock
  extend QueueLogger

  @queue = AppSettings.queues[:hook_queue_name].to_sym
  @lock_timeout = 600
  @retry_exceptions = [QueueError::LockFailed]
  @retry_limit = 600
  @retry_delay = 1

  class << self
    def perform(web_hook_payload_id, _whiplash_customer_id)
      ActiveRecord::Base.clear_active_connections!
      @web_hook_payload = WebHookPayload.find(web_hook_payload_id)
      klass_constructor …
Run Code Online (Sandbox Code Playgroud)

ruby rspec ruby-on-rails resque resque-retry

19
推荐指数
1
解决办法
1895
查看次数

从Heroku上的Resque :: TermException或SIGTERM中彻底恢复

当我们重新启动或部署我们得到的失败队列数Resque工作与任一Resque::TermException (SIGTERM)Resque::DirtyExit.

我们TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10在Procfile中使用new ,所以我们的工作线看起来像:

worker:  TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10 bundle exec rake environment resque:work QUEUE=critical,high,low
Run Code Online (Sandbox Code Playgroud)

我们也在使用resque-retry我认为可能会自动重试这两个例外情况?但它似乎不是.

所以我猜两个问题:

  1. 我们可以Resque::TermException在每个工作中手动救援,并使用它来重新安排工作.但对于所有工作,是否有一种干净的方法可以做到这一点?即使是猴子补丁.
  2. 不应该resque-retry自动重试这些?你能想出为什么不会这样的原因吗?

谢谢!

编辑:在不到10秒的时间内完成所有工作,这似乎是不合理的.在运行Resque :: DirtyExit异常时,似乎需要有一种方法来自动重新排队这些作业.

heroku resque resque-retry

11
推荐指数
3
解决办法
4799
查看次数

我在哪里放置resque-retry故障后端代码?

resque重试执行时,宝石的README讨论改变失败的后端实现.

MultipleWithRetrySuppression 是一个多重故障后端,具有重试抑制功能.

这是一个使用Redis故障后端的示例:

require 'resque-retry'
require 'resque/failure/redis'

# require your jobs & application code.

Resque::Failure::MultipleWithRetrySuppression.classes = [Resque::Failure::Redis]
Resque::Failure.backend = Resque::Failure::MultipleWithRetrySuppression
Run Code Online (Sandbox Code Playgroud)

如果作业失败,但可以并且将重试,则失败详细信息将不会记录在Redis失败队列中(通过resque-web可见).

如果作业失败,但不能或不会重试,则失败将记录在Redis失败的队列中,就像正常失败(没有重试)那样.

我不确定我的Rails应用程序中的代码应该去哪里.我应该将它放入任何随机初始化文件中,例如config/initializers/resque.rb?或者我的应用程序中还有其他地方应该去哪里?文件不清楚.

ruby-on-rails resque ruby-on-rails-3 resque-retry

5
推荐指数
1
解决办法
1013
查看次数

例外:从DocumentDB查询时出现Microsoft.Azure.Documents.RequestRateTooLargeException

y查询是这样的

this.ProcessRequestSync(() => this.Client.CreateDocumentQuery<Model>(this.DocumentDBCollectionLink).Where(d => d.name.Equals(name) && d.code.Equals(code) && d.Type.Equals(this.documentType) && d.CreatedBy.Equals(myName).ToList<Model>());

 public dynamic ProcessRequestSync(Func<dynamic> getRequest)
{
    var delay = TimeSpan.Zero;
    var minDelayTime = new TimeSpan(0, 0, 1);
    for (;;)
    {
        try
        {
            Thread.Sleep(delay);
            return getRequest();
        }
        catch (DocumentClientException documentClientException)
        {
            var statusCode = (int)documentClientException.StatusCode;
            if (statusCode == 429 || statusCode == 503)
            {
                string errorMessage = string.Format("failed at DocumentDB with {0} status and {1} retry time", statusCode, documentClientException.RetryAfter);
                this.Logger.Log(errorMessage );

                // Back off if the request rate is too …
Run Code Online (Sandbox Code Playgroud)

c# bulkinsert resque-retry azure-cosmosdb

5
推荐指数
2
解决办法
3458
查看次数