我正在尝试使我的Rails应用使用Resque
来管理工作人员。但是,我想继续使用ConnectionPool gem。
我在初始化器中有这个:
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
返回?我已经搜索了所有gems源代码,但没有地方设置
$redis
的值。在ConnectionPool的源代码中,我找不到任何可以返回Redis
实例而不是其自身的内容。这仅在我从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
。任何帮助是极大的赞赏。
最佳答案
从文档:
我看起来ConnectionPool::Wrapper
旨在包装与Redis的单个连接,以方便将大型应用程序从直接使用Redis迁移到使用ConnectionPool
。
如果调用$redis.with
,则将获得#with
定义的ConnectionPool
要获得实际的连接池,只需更改您的
ConnectionPool::Wrapper.new(:size => 5, :timeout => 3) { #redis logic }
至
ConnectionPool.new(:size => 5, :timeout => 3) { #redis logic }
关于ruby - 连接池返回Redis实例而不是ConnectionPool实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14915351/