Ruby Net을 사용하여 다시 연결 전략을 구현합니다
-
05-07-2019 - |
문제
XML을 일부 웹 서비스에 게시하는 작은 응용 프로그램을 개발하고 있습니다. 이것은 net :: http :: post :: post를 사용하여 수행됩니다. 그러나 서비스 제공 업체는 다시 연결을 사용하는 것이 좋습니다.
다음과 같은 것 : 첫 번째 요청 실패 -> 2 초 후 다시 시도 2nd 요청이 실패 -> 5 초 후에 다시 시도하십시오.
그렇게하기위한 좋은 접근법은 무엇입니까? 루프에서 다음 코드를 실행하면 예외를 잡고 시간이 지나면 다시 실행합니까? 아니면 다른 영리한 방법이 있습니까? 아마도 그물 패키지에는 내가 알지 못하는 기능이 내장되어 있습니까?
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)}
대단히 감사합니다. 항상 귀하의 지원에 감사드립니다.
매트
해결책
이것은 루비가 retry
편리합니다. 이 라인을 따라 무언가 :
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
다른 팁
나는 보석을 사용합니다 재 시도 재 시도. IT 코드로 변환됩니다.
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
제휴하지 않습니다 StackOverflow