class Sad::Payload
Attributes
args[RW]
klass[RW]
redis[RW]
sad_args[RW]
Public Class Methods
decode(json)
click to toggle source
# File lib/sad/payload.rb, line 67 def self.decode(json) h = JSON.parse(json) if h['sad_args'] or h['sad_args'] != '' self.new(h['klass'], h['args'], h['sad_args']) else self.new(h['klass'], h['args']) end end
new(klass, args = [], sad_args = {})
click to toggle source
# File lib/sad/payload.rb, line 7 def initialize(klass, args = [], sad_args = {}) @klass = klass @args = args @sad_args = { 'retry' => 0, 'delay' => 0 }.update(sad_args) end
Public Instance Methods
encode()
click to toggle source
# File lib/sad/payload.rb, line 20 def encode { 'klass' => @klass, 'args' => @args, 'sad_args' => @sad_args }.to_json end
enqueue(&blk)
click to toggle source
# File lib/sad/payload.rb, line 47 def enqueue(&blk) self.wrap_redis_rpush(self.sad_args['queue'], self.encode) do |value| blk.call(value) if blk end end
perform()
click to toggle source
执行任务 当执行任务的perform出错时 重试1至::Sad::Config.max_retry次 每次重试时,延迟重试次数*::Sad::Config.interval的时长后,再enqueue
# File lib/sad/payload.rb, line 32 def perform begin @klass.constantize.send :perform, *@args rescue Exception => e ::Sad.logger.error "Payload perform error:\n#{e.to_s}\n#{e.backtrace.join($/)}" if self.sad_args['retry'] and (self.sad_args['retry'].to_i < ::Sad::Config.max_retry) self.sad_args['retry'] = self.sad_args['retry'].to_i + 1 self.sad_args['delay'] = ::Sad::Config.interval * self.sad_args['retry'] self.enqueue else ::Sad.logger.error "Payload perform error for #{self.sad_args['retry']} retrys:\n#{self.inspect}\nException:\n#{e.inspect}\nBacktrace:\n#{e.backtrace.inspect}" end end end
wrap_redis_rpush(queue, data, &blk)
click to toggle source
# File lib/sad/payload.rb, line 53 def wrap_redis_rpush(queue, data, &blk) case self.redis.class.to_s when "EM::Hiredis::Client", "EventMachine::Hiredis::Client" self.redis.rpush(queue, data) do |value| blk.call(value) end when "Redis", "Redis::Namespace" self.redis.rpush(queue, data) blk.call(data) else raise RuntimeError, "No redis client support!\nself.redis => #{self.redis.to_s}\n#{self.inspect}" end end