2009-07-29 17 views
6

Bazı web servislerine XML gönderen küçük bir uygulama geliştiriyorum. Bu, Net :: HTTP :: Post :: Post kullanılarak yapılır. Ancak, servis sağlayıcı yeniden bağlanmayı önerir.Ruby Net kullanarak Yeniden Bağlanma Stratejisi Uygulaması

gibi bir şey: 1 isteği başarısız -> 3 isteği başarısız 5 saniye sonra tekrar deneyin - -> 2 isteği başarısız 2 saniye sonra tekrar deneyin> ... 10 saniye sonra tekrar deneyin

neler olur Bunu yapmak için iyi bir yaklaşım mı? Aşağıdaki kod parçasını döngü içinde çalıştırmak, istisnayı yakalamak ve bir süre sonra tekrar çalıştırmak mı? Yoksa bunu yapmanın başka zekice bir yolu var mı? Belki de Net paketinin farkında olmadığım bazı işlevler var mı?

url = URI.parse("http://some.host") 

request = Net::HTTP::Post.new(url.path) 

request.body = xml 

request.content_type = "text/xml" 


#run this line in a loop?? 
response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)} 

Çok teşekkürler, desteğiniz için her zaman minnettarız.

Matt

cevap

15

Ruby'nin retry kullanışlı geldiğinde bu nadir durumlarda biridir. Bu doğrultuda bir şey:

retries = [3, 5, 10] 
begin 
    response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)} 
rescue SomeException # I'm too lazy to look it up 
    if delay = retries.shift # will be nil if the list is empty 
    sleep delay 
    retry # backs up to just after the "begin" 
    else 
    raise # with no args re-raises original error 
    end 
end 
+0

Mükemmel Bununla beraber dönüştürdü alan kodu. Teşekkürler! – Matt

+0

Avdi, bunu test etmenin iyi bir yolu nedir? (rspec veya herhangi birini kullanarak) – Mike

+0

Teşekkürler. Btw 'SomeException', maalesef 'StandardError' olmalıdır, cf: http://stackoverflow.com/questions/5370697/what-s-the-best-way-to-handle-exceptions-from-nethttp. Mükemmel değil, ama en azından bir çizgiye kadar uzanır ve geçici olmayan bir gerçek hata ise yutulmaz. – chesterbr

2

ben yeniden deneme mücevher retryable kullanın.

retries = [3, 5, 10] 
begin 
    response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)} 
rescue SomeException # I'm too lazy to look it up 
    if delay = retries.shift # will be nil if the list is empty 
    sleep delay 
    retry # backs up to just after the "begin" 
    else 
    raise # with no args re-raises original error 
    end 
end 

için:

retryable(:tries => 10, :on => [SomeException]) do 
    response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)} 
end 
+1

Ucu – daniel

+0

için güzel gem thx eşit değil: ilk gecikmeler ile 4 kravat yapıyor 0,3,5,10; ikinci 1 saniyelik gecikme ile 10 çalışır. – hlcs

İlgili konular