2009-07-29 34 views
6

Tôi đang phát triển một ứng dụng nhỏ đăng XML vào một số dịch vụ web. Điều này được thực hiện bằng cách sử dụng Net :: HTTP :: Post :: Post. Tuy nhiên, nhà cung cấp dịch vụ khuyên bạn nên sử dụng lại kết nối.Thực hiện chiến lược kết nối lại bằng Ruby Net

Cái gì như: yêu cầu 1 thất bại -> thử lại sau 2 giây yêu cầu thứ 2 thất bại -> thử lại sau 5 giây yêu cầu thứ 3 thất bại -> thử lại sau 10 giây ...

gì sẽ là một cách tiếp cận tốt để làm điều đó? Chỉ cần chạy đoạn mã sau đây trong một vòng lặp, bắt ngoại lệ và chạy lại sau một khoảng thời gian? Hay có cách nào khác để làm điều đó? Có lẽ gói Net thậm chí còn có một số chức năng được tích hợp sẵn mà tôi không biết?

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)} 

Cảm ơn rất nhiều, luôn đánh giá cao sự hỗ trợ của bạn.

Matt

Trả lời

15

Đây là một trong những trường hợp hiếm hoi khi Ruby retry có ích. Một cái gì đó dọc theo các dòng này:

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

Tuyệt vời. Cảm ơn! – Matt

+0

Avdi, whats một cách tốt để kiểm tra này? (sử dụng rspec hoặc bất kỳ) – Mike

+0

Cảm ơn. Btw có vẻ như 'SomeException' phải, không may là 'StandardError', cf: http://stackoverflow.com/questions/5370697/what-s-the-best-way-to-handle-exceptions-from-nethttp. Không tuyệt vời, nhưng ít nhất nó được dàn vào một đường kẻ, và không nuốt phải nếu đó là một lỗi không thực sự thoáng qua. – chesterbr

2

Tôi sử dụng đá quý retryable để thử lại. Với nó Mã chuyển đổi từ:

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 

Để:

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

đá quý đẹp thx cho các tip – daniel

+0

chúng không bằng nhau: đầu tiên là làm 4 mối quan hệ với sự chậm trễ 0,3,5,10; thứ hai đang thực hiện 10 lần thử với thời gian trễ là 1 giây. – hlcs

Các vấn đề liên quan