麻烦从Bunny Connection Net抢救:: ReadTimeout

时间:2017-08-14 00:01:23

标签: ruby rabbitmq bunny

我有一个ruby脚本,它使用Bunny Gem连接到rabbitmq实例。该脚本可以运行一段时间,但最终会因为Net :: ReadTimeout

而死亡
E, [2017-08-13T08:48:09.671988 #21351] ERROR -- #<Bunny::Session:0x39eca20 scrapes@104.196.154.25:5672, vhost=/, addresses=[104.196.154.25:5672]>: Uncaught exception from consumer #<Bunny::Consumer:32353120 @channel_id=1 @queue=sc_link_queue> @c
onsumer_tag=bunny-1502631967000-46739673895>: #<Net::ReadTimeout: Net::ReadTimeout> @ /home/rails/.rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/net/protocol.rb:158:in `rbuf_fill'
E, [2017-08-13T08:48:32.468023 #23205] ERROR -- #<Bunny::Session:0x42202a0 scrapes@104.196.154.25:5672, vhost=/, addresses=[104.196.154.25:5672]>: Uncaught exception from consumer #<Bunny::Consumer:36695920 @channel_id=1 @queue=sc_link_queue> @c
onsumer_tag=bunny-1502631972000-482787698591>: #<Net::ReadTimeout: Net::ReadTimeout> @ /home/rails/.rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/net/protocol.rb:158:in `rbuf_fill'

我的脚本看起来像这样

module Sc
  class Worker
    def initialize
      init()
    end

    def self.start_headless(type)
      Headless.new(display: 50, destroy_at_exit: false, resuse: true).start
      worker = new
      worker.send(type)
    end

    def init
      $conn ||= Bunny.new($rabbitmq_opts)
      $conn.start
      @browser = Sc::Browser.new()
    rescue Timeout::Error, Net::ReadTimeout, Selenium::WebDriver::Error::UnknownError, Errno::ECONNREFUSED, Selenium::WebDriver::Error::JavascriptError, Exception, StandardError => e
      LOGGER.error("[x] Trouble connecting to rabbitmq, retrying...")
      LOGGER.error("[x] #{e}")
      LOGGER.error("[x] #{e.backtrace}")
      retry
    end

    def listen_for_searches
      channel = $conn.create_channel
      channel.prefetch(1)
      queue = channel.queue($rabbitmq_search_queue, durable: true)
      exchange = channel.default_exchange
      queue.subscribe(:manual_ack => true, :block => true) do |delivery_info, properties, payload|
        LOGGER.info "[x] Received #{payload}"
        payload = JSON.parse(payload)
        scrape = Sc::Search.new(browser: @browser.browser, county: payload["name"], type: payload["type"], date_type: payload["date_type"])
        scrape.run
        scrape.close
        channel.ack(delivery_info.delivery_tag)
      end
    rescue Timeout::Error, Net::ReadTimeout, Selenium::WebDriver::Error::UnknownError, Errno::ECONNREFUSED, Selenium::WebDriver::Error::JavascriptError, Exception, StandardError => e
      LOGGER.error("[x] #{e}")
      LOGGER.error("[x] #{e.backtrace}")
      LOGGER.error("[x] Trouble with scrape, retrying...")
      retry
    end
  end
end

正如你所看到的那样,我试图拯救几乎所有可能发生的事情。我仍然无法从Net :: ReadTimeout错误中恢复。一旦工人死亡,你仍然可以看到它连接到rabbitmq,但它从队列中取出的最后一项是未确认的,它基本上是挂起的。

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。问题是在Bunny订阅块中运行的所有内容都在不同的线程中处理,因此您需要将rescue语句添加到该块中。