问题描述
task :wait_for_vault_ssl_up do
Timeout::timeout(15) do
begin
Tcpsocket.new('localhost',8200).close
puts "Vault ssl up and ready!"
true
rescue Errno::ECONNREFUSED,Errno::ehostunreach,SocketError
puts "Vault ssl not ready... retrying"
retry
false
end
end
rescue Timeout::Error
false
end
在这里,我将超时设置为 15 秒并尝试连接到 localhost:8200
我的问题是,如果它没有启动,我目前会在救援中重试。这是必要的还是会自动继续尝试连接 15 秒?
解决方法
使用 retry
将重试执行整个被抢救的块。因此,在这种情况下,retry
将在您调用 TCPSocket.new
时重新开始执行。这将在异常被抢救后立即发生,不会有任何延迟。
正如 Stefan 在评论中提到的,您应该在调用 retry
之前使用 Kernel#sleep
。这将继续重试直到被中断,所以如果您发现自己处于 SSL 连接永远不会准备好的情况,代码将永远循环。您可以跟踪重试次数,或者继续使用 Timeout::timeout
,使用更长的超时长度,此时循环应该完全放弃。
我认为更清晰、更简单的解决方案是使用重试计数器,并在预定义的重试次数后放弃。