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,再自己反序列化。