美文网首页ruby on rails
demo for delayed_job gem

demo for delayed_job gem

作者: 五月的约修亚 | 来源:发表于2017-03-10 17:03 被阅读0次

    配置

    STEP 1

    如果使用数据库存储任务队列,在Gemfile中加入

    gem 'delayed_job_active_record'
    

    然后执行

    bundle install
    

    STEP 2

    生成delayed_job需要的文件

    rails generate delayed_job:active_record
    

    执行迁移文件(或手动建表delayed_jobs)

    rails db:migrate
    

    config/application.rb中配置

    config.active_job.queue_adapter = :delayed_job
    

    配置config/initializers/delayed_job_config.rb

    Delayed::Worker.destroy_failed_jobs = false
    Delayed::Worker.sleep_delay = 60
    Delayed::Worker.max_attempts = 3
    Delayed::Worker.max_run_time = 5.minutes
    Delayed::Worker.read_ahead = 10
    Delayed::Worker.default_queue_name = ‘default’
    Delayed::Worker.delay_jobs = !Rails.env.test?
    Delayed::Worker.raise_signal_exceptions = :term
    Delayed::Worker.logger = Logger.new(Rails.configuration.log_root + 'delayed_job.log')
    

    STEP 3

    启动任务处理器
    如果是development环境可以用如下方式:

    前台运行的worker线程,会直接在terminal打印log

    rake jobs:work
    

    如果是线上环境,最好使用脚本启动方式,这会监控jobs的进程,并且允许后台运行多个线程

    后台开始/关闭worker线程

    RAILS_ENV=production bin/delayed_job start
    RAILS_ENV=production bin/delayed_job stop
    

    STEP 4

    在Controller中只需要在对象或类方法名前加入 .delay(run_at: 1.minutes.from_now).method(),就可以让该线程运行在后台

    使用示例

    亲测似乎只能在model和controller中使用,在util中使用一直失败

    ### Call .delay.method(params) on any object and it will be processed in the background.
    # without delayed_job
    @user.activate!(@device)
     
    # with delayed_job
    @user.delay.activate!(@device)
     
    ### If a method should always be run in the background, you can call #handle_asynchronously after the method declaration:
    class Device
      def deliver
        # long running method
      end
      handle_asynchronously :deliver, :run_at => 5.minutes.from_now, :priority => 0, :queue => "default"
    end
     
    device = Device.new
    device.deliver
    

    handle_asynchronouslydelay 方法支持如下参数

    • :priority (number): 越小优先级越高,默认为0
    • :run_at (Time): 多久以后执行该job
    • :queue (string): 指定要将该job放到哪个队里里

    命令

    #前台运行的worker线程,会直接在terminal打印log
    rake jobs:work
    #后台开始/重启/关闭worker线程
    RAILS_ENV=production bin/delayed_job start
    RAILS_ENV=production bin/delayed_job restart
    RAILS_ENV=production bin/delayed_job stop
    #处理[某个队列]所有任务后退出
    rake jobs:workoff
    QUEUE=tracking rake jobs:work
    #删除所有jobs
    rake jobs:clear
    

    问题

    1. 存在delayed_jobs表里的时间都是UTC的,也就是比北京时间提前了8小时,怎么调整?
      答:没有找到合适的方法,如果设置config/application
    config.time_zone = 'Beijing'
    config.active_record.default_timezone = 'Beijing'
    

    则存到表里的时间为北京时间,但是delayed_job似乎还是要等到UTC时间走到表中的时间才会执行

    1. log怎么看
      答:在表中可以看注册但没执行的任务,参数、时间、尝试次数等
      log可以在config/initializers/delayed_job_config.rb中配置

    参考
    4 Simple Steps to Implement “Delayed Job” in Rails
    https://github.com/collectiveidea/delayed_job

    相关文章

      网友评论

        本文标题:demo for delayed_job gem

        本文链接:https://www.haomeiwen.com/subject/jfkogttx.html