簡體   English   中英

隨機超時:機械化寶石的Ruby中的錯誤異常

[英]Randomness Timeout:Error Exception in Ruby with Mechanize Gem

我正在Ruby 1.9.3-p327中構建一個應用程序,該應用程序獲取-解析一些頁面(報廢),然后根據一些值將一些列插入/更新到數據庫中。 為了獲取解析,該應用程序使用Mechanize gem,並且通過activerecord gem訪問數據庫(MySQL)。

我遇到的怪異問題是,有時會引發Timeout :: Error異常隨機性,有時不會發生,但可能會再過兩天,並且記錄或頁面的類型會不同。 異常的日志為:

/root/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:146:in `rescue in rbuf_fill': too many connection resets (due to Timeout::Error - Timeout::Error) after 0 requests on 21716860, last used 1378984537.2796552 seconds ago (Net::HTTP::Persistent::Error)
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:140:in `rbuf_fill'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:122:in `readuntil'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:132:in `readline'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/net/http.rb:2562:in `read_status_line'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/net/http.rb:2551:in `read_new'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/net/http.rb:1319:in `block in transport_request'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/net/http.rb:1316:in `catch'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/net/http.rb:1316:in `transport_request'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/net/http.rb:1293:in `request'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/net-http-persistent-2.9/lib/net/http/persistent.rb:986:in `request'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/mechanize-2.7.2/lib/mechanize/http/agent.rb:257:in `fetch'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/mechanize-2.7.2/lib/mechanize.rb:432:in `get'
    from /root/notificador-corte/lib/downloader.rb:10:in `fetch'
    from /root/notificador-corte/worker.rb:63:in `fetch_page'
    from /root/notificador-corte/worker.rb:49:in `process_causa'
    from /root/notificador-corte/worker.rb:41:in `block in worker_main_cycle'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-4.0.0/lib/active_record/relation/delegation.rb:13:in `each'
    from /root/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-4.0.0/lib/active_record/relation/delegation.rb:13:in `each'
    from /root/notificador-corte/worker.rb:39:in `worker_main_cycle'
    from /root/notificador-corte/worker.rb:26:in `run'
    from /root/notificador-corte/app.rb:12:in `<main>'

downloader.rb第10行包含fetch方法的定義:

def fetch(url)
    begin
      @agent.get(url) )
    rescue Errno::ETIMEDOUT, Timeout::Error => exception
    end
  end

第63行的worker.rb包含對fetch方法的調用。

閱讀文檔,說我應該嘗試設置read_timeout,open_timeout為代理(機械化)性能,並且還與idle_timeout,KEEP_ALIVE嘗試,但仍然存在錯誤的隨機性。

Gemfile的內容為:

gem 'activerecord', "~> 4.0.0" 
gem 'mechanize', "~> 2.7.1"
gem 'mysql', '~> 2.9.1'
gem 'actionmailer', "~> 4.0.0" 
gem 'rspec', "~> 2.14.1"

我認為這不一定是代碼中的錯誤,也不一定是使其自身機械化的錯誤。 最有可能是網絡問題。

我寧願在該rescue語句中實施一項策略,以便確保確保每當發生此錯誤時,您都可以稍后重試。

當您營救時

 Errno::ETIMEDOUT

這是拼寫錯誤嗎? 還是我不熟悉的東西?

您的問題很有可能是某些不良的網站或鏈接。 當我刮擦整個互聯網時,我遇到了各種各樣的問題。 我發現最好捕獲所有錯誤,打印錯誤消息,然后繼續下一個可能的操作。.這樣,您的刮板機將不會在嚴重的情況下停止工作,並且您可以返回並解決出現的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM