문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top