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
|