【发布时间】:2016-08-05 09:25:06
【问题描述】:
我在 Heroku 上遇到了一个非常奇怪的问题,我一直在琢磨一段时间。
我的应用程序有一些外部 API 调用和邮件程序,我已将 ActiveJob 设置为在后台运行。在 Heroku 上,我设置了两个工作人员,并且根据以下 sn-ps,我正在使用 Resque/Redis 组合来完成工作。我在 Heroku 上使用 Redis Cloud 插件。
配置/设置
过程文件
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 QUEUE=* bundle exec rake resque:work
lib/tasks/resque.rake
require "resque/tasks"
require "resque/scheduler/tasks"
task "resque:setup": :environment do
Resque.before_fork = proc { ActiveRecord::Base.connection.disconnect! }
Resque.after_fork = proc { ActiveRecord::Base.establish_connection }
end
config/initializers/active_job.rb
Rails.application.config.active_job.queue_adapter = :resque
config/initializers/redis.rb
if ENV["REDISCLOUD_URL"]
$redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
config/initializers/resque.rb
if Rails.env.production?
uri = URI.parse ENV["REDISCLOUD_URL"]
Resque.redis = Redis.new(host: uri.host, port: uri.port,
password: uri.password)
else
Resque.redis = "localhost:6379"
end
问题
我遇到的问题是,当用户在浏览器中使用应用程序(即与网络工作者交互)并执行触发其中一个 ActiveJob 作业的操作时,该作业使用web“内联”运行工人而不是resque 工人。当我在 Heroku 应用程序控制台(通过运行 heroku run rails console 打开)中运行将作业排队的特定模型方法时,它会将作业添加到 Redis 并按预期使用 resque 工作器运行它。
为什么一种方法可以正常工作而另一种方法不能工作?我已经查看了几乎所有关于该主题的教程/SO 问题,并尝试了所有方法,所以任何帮助让工作运行,但合适的工作人员会很棒!
提前致谢!
【问题讨论】:
标签: ruby-on-rails heroku resque