Rails delay_job的确切工作执行顺序

问题描述

|| 我正在使用Collectoridea的delay_job版本:https://github.com/collectiveidea/delayed_job 谁能指出我当工人去选择下一份工作时所使用的实际标准?我假设它就像\“ SELECT ID FROM delay_jobs where run_at> Now()ORDER BY priority ASC,run_at ASC LIMIT 1 \”(优先选择优先,run_at时间第二),但是我还没有\'无法准确找到要考虑的内容。我已经在GitHub上的代码中做了一些探索,但是还没有找到下一份工作的实际查询。对几件事感到好奇,包括是否将\'created_at \',\'attempts \'或\'Failed_at \'纳入优先级。 (而且我意识到我不太可能找到实际的sql,这只是表示我假设查询所做的一种简单方法)。 其次,该宝石的实际文档有什么好的来源?对于在Rails中如此普遍使用的东西,我所见过的文档相当稀疏。     

解决方法

有点挖掘源代码可以在backend / active_record.rb中看到:
    scope :ready_to_run,lambda {|worker_name,max_run_time|
      where([\'(run_at <= ? AND (locked_at IS NULL OR locked_at < ?) OR locked_by = ?) AND failed_at IS NULL\',db_time_now,db_time_now - max_run_time,worker_name])
    }
    scope :by_priority,order(\'priority ASC,run_at ASC\')

    # Find a few candidate jobs to run (in case some immediately get locked by others).
    def self.find_available(worker_name,limit = 5,max_run_time = Worker.max_run_time)
      scope = self.ready_to_run(worker_name,max_run_time)
      scope = scope.scoped(:conditions => [\'priority >= ?\',Worker.min_priority]) if Worker.min_priority
      scope = scope.scoped(:conditions => [\'priority <= ?\',Worker.max_priority]) if Worker.max_priority

      ::ActiveRecord::Base.silence do
        scope.by_priority.all(:limit => limit)
      end
    end
同样,backend / base.rb中的这一位很有趣:
    def reserve(worker,max_run_time = Worker.max_run_time)
      # We get up to 5 jobs from the db. In case we cannot get exclusive access to a job we try the next.
      # this leads to a more even distribution of jobs across the worker processes
      find_available(worker.name,5,max_run_time).detect do |job|
        job.lock_exclusively!(max_run_time,worker.name)
      end
    end
工人叫
reserve
以选择下一份工作。     ,
delayed_job/lib/delayed/backend/active_record.rb
self.find_available
通话
ready_to_run
然后根据当前工作人员的最小/最大优先级对其进行范围划分 然后按ѭ6订购
scope :ready_to_run
电话
where([\'(run_at <= ? AND (locked_at IS NULL OR locked_at < ?) OR locked_by = ?) AND failed_at IS NULL\',worker_name])
所以它产生类似
SELECT * FROM jobs where run at <= ? AND locked_at IS NULL OR locked_at < ?) OR locked_by = ?) AND failed_at IS NULL AND priority >= ? AND priority <= ? ORDER BY priority ASC,run_at ASC
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...