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