sad

:sob: 悲剧,居然找不到好用的基于Eventmachine的后台任务,只好自己写了。

快速入门

测试类的定义

class SadJob
        extend ::Sad::Worker
        
        def self.queue
                'MySadJob'
        end

        # optional
        def     self.redis
                # support: em-hiredis, redis, redis-namespace
        end

        def self.perform(*args)
                puts "I'm in sad job perform method."
                puts args
        end
end

在一个IRB/PRY中执行

EM.run{
        EM::PeriodicTimer.new(3){
                Imdb::SadJob.enqueue('hello',{:x=>['hi',123], :y => {}})
        }
}

在另外一个IRB/PRY中执行

EM.run{
        Sad::Server.run('MySadJob')
}

两个运行环境都要有SadJob这个测试类的定义存在

在项目中使用

在Gemfile中添加:

gem 'sad', :git => 'git@github.com:charlescui/sad.git'

在Rakefile中添加:

require "sad/tasks"

配置redis:

Sad::Config.redis = "redis://:secretpassword@example.com:9000/4"
Sad::Config.namespace = 'MyBackgroundJobQueue'

查看是否有sad的rake任务:

            saimatoMacBook-Pro:rca.imdb cuizheng$ bundle exec rake -T
            rake sad:restart                # restart sad with args - COUNT=4 QUEUE=sosad INTERVAL=2 DIR=./tmp/pids
            rake sad:start                  # start sad with args - COUNT=4 QUEUE=sosad INTERVAL=2 DIR=./tmp/pids
            rake sad:stop                   # stop sad with args - COUNT=4 QUEUE=sosad INTERVAL=2 DIR=./tmp/pids

启动:bundle exec rake sad:start COUNT=2 QUEUE=sosad DIR=./tmp/pids

检查下目录是否有pid文件

            saimatoMacBook-Pro:rca.imdb cuizheng$ ll tmp/pids/
            total 40
            -rw-r--r--  1 cuizheng  staff  1315  4 26 15:36 Sad-1.output
            -rw-r--r--  1 cuizheng  staff     5  4 26 15:32 Sad-10.pid
            -rw-r--r--  1 cuizheng  staff  1138  4 26 15:36 Sad-2.output
            -rw-r--r--  1 cuizheng  staff     5  4 26 15:32 Sad-20.pid

查看下进程

            saimatoMacBook-Pro:rca.imdb cuizheng$ !ps
            ps ax|grep Sad
             6178   ??  R      0:02.58 Sad-1      
             6181   ??  S      0:02.61 Sad-2      
             6522 s002  R+     0:00.00 grep Sad

测试

启动一个队列

bundle exec rake sad:restart COUNT=1 QUEUE=MySadJob DIR=./tmp/pids

执行最简单的测试

bundle exec ruby ./test/test_sad.rb

执行异常任务测试,异常是指Klass.perform函数执行时出现异常,如果是异步任务,没办法知道异常,因为执行完perform后,代码运行环境已经脱离sad了,需要人工自己处理.

当Klass.perform出错时,会延时重试,重试三次后,如果还有错误,则放弃该任务.

bundle exec ruby ./test/test_perform_with_exception.rb

在异步模式的代码中,异常如果被抛给top level的运行时的话,则代码无法控制,所以有异常的时候一定要捕获到,写在类似errback的回调中,对于Sad的重试,自动重试只能保证perform执行没问题,如果在callback中出错,则需要用户手工将该任务重新enqueue来实现重试的机制。

任务配置

SadJob.enqueue(1,2,3,4,5){|payload|
        # delay -> 当sad进程得到该任务时并不立即执行,而是延迟多干秒后执行
        payload.sad_args['delay'] = 5
}

日志logger

Sad.logger是个Logger的实例,通过如下方式来配置:

Sad.logger = {:path => 'sad.production.log', :level => 2}
Sad.logger.error("Crashed!!!")

level的取值如下:

Contributing to sad

Copyright © 2013 崔峥. See LICENSE.txt for further details.