Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.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 Heroku上带有Resque的背景作业_Ruby On Rails_Heroku_Resque - Fatal编程技术网

Ruby on rails Heroku上带有Resque的背景作业

Ruby on rails Heroku上带有Resque的背景作业,ruby-on-rails,heroku,resque,Ruby On Rails,Heroku,Resque,我在Heroku上遇到了一个非常奇怪的问题,我一直在努力解决这个问题 我的应用程序有一些外部API调用和邮件程序,我已将ActiveJob设置为在后台运行。在Heroku上,我有两个工人被设置为,我正在使用Resque/Redis组合来完成以下工作。我正在Heroku上使用Redis云插件 配置/设置 Procfile web: bundle exec puma -C config/puma.rb resque: env TERM_CHILD=1 QUEUE=* bundle exec rake

我在Heroku上遇到了一个非常奇怪的问题,我一直在努力解决这个问题

我的应用程序有一些外部API调用和邮件程序,我已将ActiveJob设置为在后台运行。在Heroku上,我有两个工人被设置为,我正在使用Resque/Redis组合来完成以下工作。我正在Heroku上使用Redis云插件

配置/设置 Procfile

web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 QUEUE=* bundle exec rake resque:work
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
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work
require "resque/tasks"

task "resque:setup" => :environment
lib/tasks/resque.rake

web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 QUEUE=* bundle exec rake resque:work
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
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work
require "resque/tasks"

task "resque:setup" => :environment
config/initializers/active_job.rb

Rails.application.config.active_job.queue_adapter = :resque
if ENV["REDISCLOUD_URL"]
  $redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
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
module App
  class Application < Rails::Application
    ...

    # Set Resque as ActiveJob queue adapter.
    config.active_job.queue_adapter = :resque
  end
end
if ENV["REDISCLOUD_URL"]
  $redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
Resque.redis = Rails.env.production? ? $redis : "localhost:6379"
config/initializers/redis.rb

Rails.application.config.active_job.queue_adapter = :resque
if ENV["REDISCLOUD_URL"]
  $redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
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
module App
  class Application < Rails::Application
    ...

    # Set Resque as ActiveJob queue adapter.
    config.active_job.queue_adapter = :resque
  end
end
if ENV["REDISCLOUD_URL"]
  $redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
Resque.redis = Rails.env.production? ? $redis : "localhost:6379"
config/initializers/resque.rb

Rails.application.config.active_job.queue_adapter = :resque
if ENV["REDISCLOUD_URL"]
  $redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
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
module App
  class Application < Rails::Application
    ...

    # Set Resque as ActiveJob queue adapter.
    config.active_job.queue_adapter = :resque
  end
end
if ENV["REDISCLOUD_URL"]
  $redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
Resque.redis = Rails.env.production? ? $redis : "localhost:6379"
问题 我遇到的问题是,当用户在浏览器中使用应用程序(即,与web worker交互)并执行一个触发某个活动作业的操作时,作业将使用
web
worker而不是
resque
worker“内联”运行。当我在我的Heroku应用程序控制台(通过运行
Heroku run rails console
打开)中运行将作业排队的特定模型方法时,它会将作业添加到Redis中,并按预期使用
resque
工作者运行它

为什么一种方法能正常工作而另一种方法不能工作?我已经看过了几乎每一个关于这个主题的教程/问题,并且尝试了所有的方法,所以任何有助于运行工作的方法,但是正确的工人将是惊人的


提前谢谢

我通过稍微玩一下我的配置来解决这个问题。似乎操作是通过ActiveJob的“内联”默认值而不是通过Resque进行隧道传输的。为了使事情正常运行,我只需将
Resque.redis
设置为等于
config/initializers/redis.rb
中设置的
$redis
变量,因此所有内容都指向同一个redis实例,然后将
config/initializers/active_job.rb
中的配置集移动到
application.rb

作为参考,所有工作的新的和改进的配置是:

配置/设置 Procfile

web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 QUEUE=* bundle exec rake resque:work
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
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work
require "resque/tasks"

task "resque:setup" => :environment
lib/tasks/resque.rake

web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 QUEUE=* bundle exec rake resque:work
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
web: bundle exec puma -C config/puma.rb
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work
require "resque/tasks"

task "resque:setup" => :environment
config/application.rb

Rails.application.config.active_job.queue_adapter = :resque
if ENV["REDISCLOUD_URL"]
  $redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
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
module App
  class Application < Rails::Application
    ...

    # Set Resque as ActiveJob queue adapter.
    config.active_job.queue_adapter = :resque
  end
end
if ENV["REDISCLOUD_URL"]
  $redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
Resque.redis = Rails.env.production? ? $redis : "localhost:6379"
config/initializers/resque.rb

Rails.application.config.active_job.queue_adapter = :resque
if ENV["REDISCLOUD_URL"]
  $redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
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
module App
  class Application < Rails::Application
    ...

    # Set Resque as ActiveJob queue adapter.
    config.active_job.queue_adapter = :resque
  end
end
if ENV["REDISCLOUD_URL"]
  $redis = Redis.new(url: ENV["REDISCLOUD_URL"])
end
Resque.redis = Rails.env.production? ? $redis : "localhost:6379"

非常感谢您提供答案。这节省了我很多时间

您的文件中有一个输入错误

这应该是一次恢复,而不是救援

resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work
此外,我还必须再输入一条命令,才能使这些都在生产中发挥作用。希望这对某人有所帮助

heroku ps:scale resque=1 --app appname
此命令将重新设定过程缩放为1 dyno(free)。您也可以在heroku上的仪表板上执行此操作


您可以在heroku文档上阅读更多关于它的内容

这似乎只是因为Rails初始值设定项是按字母顺序加载的,因此
redis.rb
是在
resque.rb
之前加载的,因此
$redis
有一个值。我个人选择了
$redis=Resque.redis=redis.new(url:ENV[“REDISCLOUD\u url]”)