Resque
Railsアプリをワーカーの管理に使用させようとしています。ただし、ConnectionPoolgemを引き続き使用したいと思います。
私はこれをイニシャライザーに持っています:
puts ENV["REDISTOGO_URL"]
uri = (not ENV["REDISTOGO_URL"].nil?) ? URI.parse(ENV["REDISTOGO_URL"]) : nil
# at this point, debugger confirms $redis is nil
$redis = ConnectionPool::Wrapper.new(:size => 5, :timeout => 3) {
if uri.nil?
Redis.connect
else
Redis.connect(:host => uri.host, :port => uri.port, :password => uri.password)
end
}
$redis # just put this in here for the debugger
# At this point, $redis is #<Redis:0x007fb1b0036bf0>
# when it should be an instance of ConnectionPool::Wrapper
なぜ$redis
インスタンスとして返されないのか、誰かが考えていますConnectionPool::Wrapper
か?
すべてのgemソースコードを検索しましたが、の値はどこにも設定されていません$redis
。Redis
ConnectionPoolのソースコードでは、それ自体の代わりにインスタンスを返す場所は見つかりませんでした。
これは、DelayedJobからResqueに切り替えた場合にのみ発生します。だから、それが問題のように思われるでしょう。しかし、私は途方に暮れています。
私はユニコーンを使用しています。これがのファイルですconfig
。
worker_processes 2
timeout 30
preload_app true
before_fork do |server, worker|
# Replace with MongoDB or whatever
if defined?(ActiveRecord::Base)
ActiveRecord::Base.connection.disconnect!
Rails.logger.info('Disconnected from ActiveRecord')
end
# If you are using Redis but not Resque, change this
if defined?(Resque)
Resque.redis.quit
Rails.logger.info('Disconnected from Redis')
end
sleep 1
end
after_fork do |server, worker|
# Replace with MongoDB or whatever
if defined?(ActiveRecord::Base)
ActiveRecord::Base.establish_connection
Rails.logger.info('Connected to ActiveRecord')
end
# If you are using Redis but not Resque, change this
if defined?(Resque)
# Yes, commented the Resque out for debugging, still get the same problem.
#Resque.redis = ENV['REDISTOGO_URL']
Rails.logger.info('Connected to Redis')
end
end
そして最後に、Procfile:
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
worker: env TERM_CHILD=1 QUEUE=* bundle exec rake resque:work
foreman
開発環境で使用しています。
どんな助けでも大歓迎です。