【问题标题】:Rails delayed job referring to old releaseRails 延迟工作指的是旧版本
【发布时间】:2015-12-03 01:36:48
【问题描述】:

我有一个在 Rails 4.2 上运行的项目,并为我的后台作业使用延迟作业 (4.0.6)。几个星期以来,我遇到了一个问题,即视频编码在查找要处理的文件时失败。错误消息包含一个旧的发布路径,该路径已在不久前被 Capistrano (3.4.0) 删除。

No such file or directory @ rb_sysopen - /var/www/apps/<app>/releases/20150906031337/static/post_assets/videos/000/436/600/original.mov

Capistrano 会自动删除旧版本,这很好(我保留 5 个版本),但我会在每次部署时重新启动 delay_job。我在共享文件夹中有 pid,它们与我在部署后运行 ps -ef | grep delayed_job 时得到的匹配。

我运行 2 名工作人员 (set :delayed_job_workers, 2),并且我使用 'capistrano3-delayed-job' (1.4.0) 作为部署公式。

重新启动时队列中确实有很多作业,但它与当时正在运行的视频编码作业不一致,可能会产生干扰(毕竟我确实保留了 5 个版本,所以即使作业是在倒数第二个上运行,该文件夹应该仍然存在)。虽然在部署时可能正在运行许多较小的作业,但 DJ 应该能够处理这些并优雅地重新启动,对吧?

工人们似乎还在徘徊,还是我错过了什么?

【问题讨论】:

  • 在每次部署时重新启动工作人员都会导致问题?
  • 不太清楚你的意思,是的,也许这是关于如何重新启动它们的问题,但我需要重新启动它们,因为它们必须获取最新的代码更改,对吧?

标签: ruby-on-rails delayed-job capistrano3 ruby-on-rails-4.2


【解决方案1】:

在每次部署时重新启动延迟的工作人员并指向最新版本必须解决这个问题。

这有一个宝石

capistrano3-delayed-job

如果您不想使用 gem,请关注完整信息。

https://github.com/collectiveidea/delayed_job/wiki/Delayed-Job-tasks-for-Capistrano-3#if-you-dont-want-to-use-a-gem

如果需要也可以参考https://github.com/imnithin/capistrano3

如果这些任务由于版本不匹配而不受支持,请从 cap3 执行自定义命令。

namespace :deploy do
  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # Your restart mechanism here, for example:
      execute :touch, release_path.join('tmp/restart.txt')
      execute "cd '#{release_path}' && RAILS_ENV=#{fetch(rails_env)} script/delayed_job -n 2 restart"
    end
  end
end

【讨论】:

  • 感谢您的回答。我确实已经像我写的那样使用了这个宝石。我认为 gem 应该比自定义代码更好地处理它。我的另一个想法是新乘客的新重启方法。我还没有阅读它,但可能会尝试降级。
猜你喜欢
  • 2011-08-06
  • 2011-05-06
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
相关资源
最近更新 更多