active job是rails的后台框架,其实只是提供了后台作业的接口,具体的适配器需要自己进行定义(其实用到的是适配器模式),其中sidekiq就是active job的适配器

安装和配置

#gem安装
gem 'sidekiq'

#配置config/application.rb
config.active_job.queue_adapter = :sidekiq #定义适配器
config.active_job.queue_name_prefix = 'mysite' #定义job的前缀
config.active_job.queue_name_delimiter = "_" #job的前缀和job名称的分隔符号

#配置初始化参数config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://localhost:6379/0' } #服务器地址
end

Sidekiq.configure_client do |config|
  config.redis = { url: 'redis://localhost:6379/0' } #客户端地址
end

#配置sidekiq的启动参数
---
:concurrency: 1
:queues:
  - default
  - mailers

  - mysite_default
  - mysite_mailers

#结合rails routes.rb内容
require 'sidekiq/web'
mount Sidekiq::Web => '/sidekiq'

#生成job
rails g job generate_random_user

#生成的具体job
class GenerateRandomUserJob < ApplicationJob
  queue_as :default #定义job的名称,邮件的默认job是mailers

  def perform(*args)
    user = User.new
    user.first_name = Faker::Name.first_name
    user.last_name = Faker::Name.last_name
    user.email = Faker::Internet.email
    user.save!
    sleep 2
  end
end

执行sidekiq

#启动redis
sidekiq是基于redis

#启动sidekiq
基于上面的config/sidekiq.yml内容,执行下面的语句
bundle exec sidekiq --environment development -C config/sidekiq.yml 

#执行job内容
GenerateRandomUserJob.perform_later  #区别于perform_now

结合使用mailer

#一般使用
UserMailer.welcome(@user).deliver_now #deliver_now是即时发送
UserMailer.welcome(@user).deliver_later #deliver_later是把工作放在后台执行,即使用active_job

#注意
1.mail中使用的job默认名称是mailers
2.使用deliver_later的功能不用把代码放置在ApplicationJob的子类中,就是不用放置在work中

相关概念globalid

#概念:唯一标识实例化对象,需要混入GlobalID::Identification模块,ActiveRecord默认混入
#标识方式
User.find(20).to_global_id #<GlobalID:0x00007fc1183fc178 @uri=#<URI::GID gid://dummy/User/20>>
User.find(20).to_global_id.uri ##<URI::GID gid://dummy/User/20>

#应用
ActiveJob支持参数使用GlobalID。这样便可以把ActiveRecord对象传给作业,而不用传递类和ID,再自己反序列化。

results matching ""

    No results matching ""