2017-08-14 11 views
0

Ich habe ein Ruby-Skript, das den Bunny Gem verwendet, um eine Verbindung zu einer Rabbitmq-Instanz herzustellen. Das Skript arbeitet für eine Weile, aber schließlich wegen eines Net sterben :: ReadtimeoutProblem Rescuing von Bunny Connection Net :: ReadTimeout

E, [2017-08-13T08:48:09.671988 #21351] ERROR -- #<Bunny::Session:0x39eca20 [email protected]: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 [email protected]: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' 

Mein Skript sieht wie folgt aus

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 

Wie man sehen kann ich versuche, von ziemlich viel zu retten alles was passieren könnte. Ich kann immer noch nicht scheinen, es vom Net :: ReadTimeout-Fehler zu erholen. Sobald der Arbeiter stirbt, kann man immer noch sehen, dass er mit Rabbitmq verbunden ist, aber der letzte Gegenstand, den er aus der Warteschlange genommen hat, ist unbestätigt, er ist im Wesentlichen aufgehängt.

Antwort

0

Ich habe das gelöst. Das Problem war, dass alles, was innerhalb des Bunny-Subskriptionsblocks ausgeführt wird, in einem anderen Thread behandelt wird. Daher müssen Sie die Rescue-Anweisungen innerhalb dieses Blocks hinzufügen.

Verwandte Themen