无法从Redis连接拒绝中解救
我试图编写一个函数,它尝试使用默认TCP设置连接到Redis,如果失败,则尝试通过unix套接字连接到Redis。 我的意图是在我的所有系统上都有一个连接脚本,其中一些使用TCP和其他使用套接字的连接脚本。
但是,我似乎无法从失败的TCP连接中解救出来。 这是我的测试脚本。
require "redis"
def r
begin
$redis ||= Redis.new
rescue
$redis = Redis.new(:path => "/tmp/redis.sock")
end
end
puts "You have #{r.keys.count} redis keys"
rescue
块永远不会被执行,而是引发异常。 这是这个脚本的输出。
/usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:236:in `rescue in establish_connection': Connection refused - Unable to connect to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED) from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:222:in `establish_connection' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:23:in `connect' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:247:in `ensure_connected' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:137:in `block in process' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:206:in `logging' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:136:in `process' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:46:in `call' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis.rb:246:in `block in keys' from /usr/local/rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis.rb:245:in `keys' from scripts/redis.rb:11:in `<main>'
我已经验证了Redis.new(:path => "/tmp/redis.sock")
按预期工作。 我试图通过使用rescue Errno::ECONNREFUSED
对我的救援块进行更具体的描述,但无济于事。 我不知道为什么我无法捕捉到这个例外。
有任何想法吗?
事实证明,调用Redis.new
时不会抛出异常。 在连接对象上的某些方法(在本例中为Redis#keys
)被调用之前,异常不会被抛出。 这个修改后的连接函数似乎有窍门。
require "redis"
def r
begin
$redis ||= Redis.new
$redis.inspect # needed to know if connection failed
rescue
$redis = Redis.new(:path => "/tmp/redis.sock")
end
$redis
end
我发现$redis.inspect
并没有实际运用REDIS
连接。 我用$redis.keys
替换它,并正确抛出异常。 请注意,我在Heroko
运行,并且传入环境变量REDISTOGO_URL
。 然后我在整个应用程序中使用一个不断的REDIS
。
在我的config / initializers / redis.rb中:
uri = URI.parse(ENV['REDISTOGO_URL'])
begin
redis ||= Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
redis.keys # needed to know if connection failed
REDIS = redis
rescue
puts("Redis not loaded on #{uri.port}")
REDIS = nil
end
链接地址: http://www.djcxy.com/p/38787.html
上一篇: Unable to rescue from Redis connection refusal
下一篇: Ruby on Rails. Bundler. Cucumber. rake aborted! Command failed with status (1)