如何解决超时时是否需要重试?
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
,使用更长的超时长度,此时循环应该完全放弃。
我认为更清晰、更简单的解决方案是使用重试计数器,并在预定义的重试次数后放弃。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。