Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 延迟的作业更新查询正在无限期运行_Ruby On Rails 3_Delayed Job - Fatal编程技术网

Ruby on rails 3 延迟的作业更新查询正在无限期运行

Ruby on rails 3 延迟的作业更新查询正在无限期运行,ruby-on-rails-3,delayed-job,Ruby On Rails 3,Delayed Job,我在rails应用程序中使用delayed_job和delayed_job_active_记录来执行后台作业。我们正在使用基于队列的延迟作业。对于启动延迟的进程,我使用以下命令 RAILS_ENV=staging script/delayed_job -i=1 --queue=queue_name start 下面的问题是,查询正在无限地触发 SQL (0.4ms) UPDATE `delayed_jobs` SET `locked_at` = '2013-04-16 09:27:23',

我在rails应用程序中使用delayed_job和delayed_job_active_记录来执行后台作业。我们正在使用基于队列的延迟作业。对于启动延迟的进程,我使用以下命令

RAILS_ENV=staging script/delayed_job -i=1 --queue=queue_name start
下面的问题是,查询正在无限地触发

SQL (0.4ms)  UPDATE `delayed_jobs` SET `locked_at` = '2013-04-16 09:27:23', `locked_by` = 'delayed_job.=2 host:ip-10-204-210-77 pid:2168' WHERE `delayed_jobs`.`queue` IN ('queue_name') AND ((run_at <= '2013-04-16 09:27:23' AND (locked_at IS NULL OR locked_at < '2013-04-16 05:27:23') OR locked_by = 'delayed_job.=2 host:ip-10-204-210-77 pid:2168') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1

SQL(0.4ms)UPDATE`delayed_jobs`SET`locked_at`='2013-04-16 09:27:23',`locked_by`='delayed_job.=2 host:ip-10-204-210-77 pid:2168',其中`delayed_jobs`.`queue`IN('queue_name')和((在运行_),因此这是一个专为Postgres设计的查询。请参阅为什么会这样

延迟作业的想法确实是它会定期查询数据库,因此只要工作人员在运行,您问题中的查询就会被触发。这种情况应该每秒钟发生一次,我无法想象这会对您的应用程序的性能产生重大影响


你是否在非常有限的硬件上运行,就像一个非常小的虚拟机一样?

我想你的意思是
延迟了\u作业
轮询太频繁(默认情况下是每
5秒一次)-我知道这会填满你的日志,看起来“无限”。:)

如果这就是你的意思,那么我建议你运行。它只会根据需要启动
delayed_作业
。许多人使用它来防止他们的工作动态闲置,但它在
development
模式下也能正常工作

请注意,如果正在使用,还需要将
gem'守护进程'
添加到
Gemfile
()。请参阅

因此,您的
Gemfile
将包含:

gem 'delayed_job_active_record'
gem 'daemons'
gem 'workless'

如果您需要更多的指导,请在下面的评论中告诉我。

我不得不使用AR的
静默
方法,只需在第68行附近的文件
[path/to/delayed\u job\u active\u record/gem]/delayed\u job\u active\u record-[any.latest.version]/lib/delayed/backend/active\u record.rb

count = ready_scope.limit(1).update_all(:locked_at => now, :locked_by => worker.name)

肮脏的解决方案,我知道,但它是有效的…欢迎提出一个更好的包装器,但对我来说,
Job.reserve
方法有足够大的空间来消除任何想法,以便在
config/initializers

我面临同样的问题,我通过在队列字段上添加索引来解决它


欲了解更多信息,请访问下面的文档

非虚拟机。amazon中的小实例。我使用的是Mysql而不是postgres。我明白了,可能因为它正在交换到磁盘,所以速度很慢?您是否检查了ruby进程的内存占用?是否愿意尝试延迟的\u作业\u活动的\u记录\u线程化,看看这是否有帮助?我很想听听您的反馈ack=)这里也一样。这是一种欺骗,因为没有工作,而且它还试图进行
更新。只是在日志中产生了很多不必要的噪音。@Menon您找到解决方案了吗?
count = silence {ready_scope.limit(1).update_all(:locked_at => now, :locked_by => worker.name)}
def self.up
  create_table :delayed_jobs, :force => true do |table|
  # Add index on queue field
  add_index :delayed_jobs, [:queue], :name => 'delayed_jobs_queue'
end