2013-07-29 3 views
0

Я пользуюсь a gem, чтобы получить код результата от Ideone.com. Жемчуг отправляет код в Ideone, а затем проверяет страницу результатов. Он проверяет timeout раз, а затем отказывается, если результата нет. Проблема в том, что он может сдаться слишком рано, но я также не хочу, чтобы он слишком долго ждал, если не будет результата. Есть ли способ узнать, когда нужно отказаться от надежды?Когда отказаться от получения результатов от внешнего веб-сервиса?

Это соответствующий код:

begin 
     sleep 3 if i > 0 
     res = JSON.load(
     Net::HTTP.post_form(
      URI.parse("http://ideone.com/ideone/Index/view/id/#{loc}/ajax/1"), 
      {} 
     ).body 
    ) 
     i += 1 
    end while res['status'] != '0' && i < timeout 

    if i == timeout 
     raise IdeoneError, "Timed out while waiting for code result." 
    end 

ответ

1

Похоже, вы хотите, чтобы настроить время ожидания сна и количество параметров попыток. Для каждого случая нет абсолютных значений, поэтому вы должны выбрать некоторые из них, наиболее подходящие для вашего приложения.

К сожалению, код драгоценного камня имеет оба этих параметра (задержка 3 секунды и 4 попытки), поэтому у вас нет элегантного способа их изменения. Таким образом, вы можете либо разветвить драгоценный камень, либо изменить его код, либо попытаться обезвредить значение константы TIMEOUT с помощью http://apidock.com/ruby/Module/const_set. Однако вы не сможете обезопасить задержку между значениями попыток без метода перезаписи .run из драгоценного камня.

FYI. Net :: HTTP имеет свои собственные тайм-ауты - сколько времени ждать соединения и ответа ideone.com. Если они превышены, Net :: HTTP вызывает исключение тайм-аута. Отстойники:

http://ruby-doc.org/stdlib-2.0/libdoc/net/http/rdoc/Net/HTTP.html#method-i-read_timeout-3D и # open_timeout =.

+0

Спасибо. Я уже разветвил камень, чтобы заставить его работать. Так что, я думаю, я должен просто снизить задержку и поднять попытки? Мне было интересно, есть ли лучший способ узнать, когда отказаться. – Ari

+0

Я не думаю, что имеет смысл повторять чаще, чем раз в 3 секунды. Я бы даже увеличил его. Только вы можете решить, как долго вы можете ждать результата. Этот код является синхронным и блокируется до указанного таймаута. Если вы запустите этот код из рубинового скрипта из некоторой фоновой задачи - вы можете долго ждать. Как 3-5 минут. Но если код выполняется как часть обработки реальных HTTP-запросов пользователя, вы обычно не хотите ждать вообще. Даже 1 секунда слишком много. Поэтому правильно выполнить некоторую асинхронную проверку с помощью push-сервера или ajax long-poll. – cryo28

+0

его запрос ajax, но пользователь будет ждать результата. в идеале я хотел бы дать его им в течение нескольких секунд, но лучше опоздать, чем дать «тайм-аут ошибки». не знаю лучшего способа избежать ошибки. – Ari

Смежные вопросы