45 lines
1.1 KiB
Ruby
45 lines
1.1 KiB
Ruby
require 'sequel'
|
|
require 'resque-metrics'
|
|
|
|
module Resque
|
|
class BaseJob
|
|
extend ::Resque::Metrics
|
|
MAX_RETRIES = 3
|
|
|
|
@@queue = ''
|
|
@@retries = 0
|
|
|
|
def self.perform(options = {})
|
|
raise NotImplementedError("This class shouldn't be directly instantiated")
|
|
end
|
|
|
|
def self.run_action(options, queue_name, action)
|
|
@@queue = queue_name
|
|
begin
|
|
action.call(options)
|
|
rescue Sequel::DatabaseDisconnectError => e
|
|
puts "DatabaseDisconnectError: #{e.message}"
|
|
|
|
regexps = [ /server has gone away/, /decryption failed or bad record mac/, /SSL SYSCALL error: EOF detected/ ]
|
|
match_found = regexps.map { |regexp| regexp.match(e.message) }.any? { |matches| matches }
|
|
|
|
if (match_found)
|
|
@@retries += 1
|
|
if (@@retries < MAX_RETRIES)
|
|
puts 'Retrying'
|
|
retry
|
|
else
|
|
raise e
|
|
end
|
|
else
|
|
raise e
|
|
end
|
|
rescue => e
|
|
CartoDB.notify_exception(e)
|
|
raise e
|
|
end
|
|
end #self.perform
|
|
|
|
end #BaseJobs
|
|
end
|