diff --git a/lib/resque/integration/engine.rb b/lib/resque/integration/engine.rb index bf1c9ee..6881da6 100644 --- a/lib/resque/integration/engine.rb +++ b/lib/resque/integration/engine.rb @@ -9,10 +9,13 @@ module Resque::Integration # @see http://guides.rubyonrails.org/engines.html class Engine < Rails::Engine rake_tasks do + load 'resque/integration/tasks/hooks.rake' load 'resque/integration/tasks/resque.rake' load 'resque/integration/tasks/supervisor.rake' end + # Читает конфиг-файлы config/resque.yml и config/resque.local.yml, + # мерджит результаты и сохраняет в Resque.config initializer 'resque-integration.config' do paths = Rails.root.join('config', 'resque.yml'), Rails.root.join('config', 'resque.local.yml') @@ -20,18 +23,17 @@ class Engine < Rails::Engine Resque.config = Resque::Integration::Configuration.new(*paths.map(&:to_s)) end + # Устанавливает для Resque соединение с Редисом, + # данные берутся из конфига (см. выше) initializer 'resque-integration.redis' do redis = Resque.config.redis Resque.redis = [redis.host, redis.port, redis.db].join(':') Resque.redis.namespace = redis.namespace - - # Reconnect on each fork - if Redis::VERSION < '3.0.0' - Resque.after_fork { Resque.redis.client.reconnect } - end end + # Конфигурирование плагина resque-failed-job-mailer. + # Данные берутся из конфига (см. выше) initializer 'resque-integration.failure_notifier' do notifier = Resque.config.failure_notifier @@ -47,12 +49,5 @@ class Engine < Rails::Engine end end end - - initializer 'resque-multi-job-forks.hook' do - # Support for resque-multi-job-forks - if ENV['JOBS_PER_FORK'] || ENV['MINUTES_PER_FORK'] - Resque.after_fork { ActiveRecord::Base.connection.reconnect! } - end - end - end -end \ No newline at end of file + end # class Engine +end # module Resque::Integration \ No newline at end of file diff --git a/lib/resque/integration/tasks/hooks.rake b/lib/resque/integration/tasks/hooks.rake new file mode 100644 index 0000000..35f5da5 --- /dev/null +++ b/lib/resque/integration/tasks/hooks.rake @@ -0,0 +1,32 @@ +# coding: utf-8 + +namespace :resque do + # Здесь мы добавляем некоторые необходимые для корректной работы "хуки". + # + # @see https://github.com/resque/resque/tree/1-x-stable#workers + task :setup => :environment do + # Reestablish Redis connection for each fork + # Tested on both redis-2.2.x and redis-3.0.x + # + # @see https://groups.google.com/forum/#!msg/ror2ru/CV96h5OGDxY/IqZbRsl-BcIJ + Resque.before_fork { Resque.redis.client.disconnect } + Resque.after_fork { Resque.redis.client.connect } + + # Нужно закрыть все соединения в **родительском** процессе, + # все остальное делает гем `resque-ensure-connected`. + # + # Вообще, он делает буквально следующее: + # Resque.after_fork { ActiveRecord::Base.connection_handler.verify_active_connections! } + # + # Это работает + Resque.before_fork { ActiveRecord::Base.connection_handler.clear_all_connections! } + + # Нужно также закрыть соединение к memcache + Resque.before_fork { Rails.cache.reset if Rails.cache.respond_to?(:reset) } + + # Support for resque-multi-job-forks + if ENV['JOBS_PER_FORK'] || ENV['MINUTES_PER_FORK'] + require 'resque-multi-job-forks' + end + end +end \ No newline at end of file