Saya memiliki kode berikut:

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

Dalam hal ini, saya menetapkan batas waktu 15 detik dan mencoba menghubungkan ke localhost:8200 pertanyaan saya adalah, jika tidak, saat ini saya mencoba lagi dalam penyelamatan. apakah itu perlu atau akan secara otomatis terus mencoba terhubung selama 15 detik?

1
acooluser779da97ads7asd 12 Mei 2021, 17:27

1 menjawab

Jawaban Terbaik

Penggunaan retry akan mencoba ulang eksekusi seluruh blok yang diselamatkan. Jadi dalam kasus ini, retry akan memulai eksekusi lagi pada panggilan Anda ke TCPSocket.new. Ini akan terjadi segera setelah pengecualian diselamatkan dan tidak akan ada penundaan.

Seperti yang disebutkan Stefan dalam komentar, Anda harus menggunakan Kernel#sleep sebelum memanggil retry. Ini akan terus mencoba lagi sampai terputus, jadi jika Anda berada dalam situasi di mana koneksi SSL tidak akan pernah siap, kode akan berulang selamanya. Anda dapat melacak jumlah percobaan ulang, atau terus menggunakan Timeout::timeout, menggunakan waktu tunggu yang lebih lama, pada saat itu loop harus menyerah sepenuhnya.

Saya pikir solusi yang lebih jelas dan sederhana adalah dengan menggunakan penghitung coba lagi, dan menyerah setelah sejumlah percobaan ulang yang telah ditentukan.

0
taylorthurlow 12 Mei 2021, 19:33