微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

超时时是否需要重试?

如何解决超时时是否需要重试?

我有以下代码

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 举报,一经查实,本站将立刻删除。