=begin
关于Rails中的ActiveJob和ActionMailer
==> 创建一个rails后台异步任务
# bin/rails generate job ClassName
- ClassNameJob < ApplicationJob < ActiveJob::Base
==> 重写任务类的实例方法perform(执行)
# ClassNameJob#perform(*args) < ActiveJob#perform(*args)
- 参数为数组, 可以有任何多个
==> 控制器中调用类方法, 将任务放入队列 - 方法名称不能变化
# 空闲执行 ClassNameJob.perform_later(*args)
# 定时执行 ClassNameJob.set(Time).perform_later(*args)
- 实质: 类方法内部调用实例方法ClassNameJob_Object.perfrom(*args)
- set => 可以有哪些参数呢
a. wait: 时间
b. queue: 队列名字
==> 与模型类想用, 终端下可直接执行类方法验证
# bin/rails console
> ClassNameJob.perform_later
==> 相关设置
# 设置后端异步队列组件 config/application.rb
全局: config.active_job.queue_adapter = :sidekiq|:resque|:delayedjob
局部: ClassNameJob > self.queue_adapter = :resque
自带默认的线程队列为 :async and :inline.
# 设置后端队列名称
全局设置前缀: config.active_job.queue_name_prefix
任务类设置后缀: ClassNameJob > queue_as :low_priority
作业层控制: ClassNameJob.set(queue: name).perform_later
动态控制: ClassNameJob > queue_as do ... end
==> 任务类回调
# 制定代码块或者类的私有方法
before_enqueue -> 入队前
around_enqueue -> 入队中
after_enqueue -> 入队后
before_perform -> 执行前
around_perform -> 执行中
after_perform -> 执行后
通常的做法是: 执行之前加载对应的模块
before_perform do
load 'lib/tasks/jenkins_tasks.rb'
logger.info '='*50
end
def perform(*args)
# Do something later
logger.info "Running Active::job.perform instance methods..."
Jtask.new("#{args[0]}").run
end
after_perform do
logger.info '*'*50
end
==> 按照后端异步队列
gem install sikekiq => 会安装一个sidekiq执行脚本
1) 启动文件initializers/sidekiq.rb
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://redis.wdxtub.com:1643/12' }
end
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://redis.wdxtub.com:1643/12' }
end
2) 配置文件sidekiq.yaml
:verbose: false
:concurrency: 5 # 并发数
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log # 输出的日志地址
:timeout: 30
:queues:
- default # 写在队列参数中的, 表示让 sidekiq 处理这个 queue
- [HardWorker, 2] # 使用数组的形式写, 第一个参数为打开的 queue 的名称, 第二个为优先级
- [EmailWorker, 3]
- [PasswordWorker, 4]
development:
:concurrency: 5
staging:
:concurrency: 10
production:
:concurrency: 5
ActiveJob的扩展 -> ActionMailer邮件
==> 创建一个rails后台邮件任务
# bin/rails generate mailer ClassName
- ClassNameMailer < ApplicationMailer < ActionMailer::Base
==> 生成的邮件程序, 邮件程序和控制器类似:也有称为"动作"的方法,而且使用视图组织内容
邮件程序生成的内容,(HTML/消息),通过电子邮件协议(SMTP)发送发送给客户端
# app/mailer/sendm_mailer.rb - 邮件程序
# app/views/sendm_mailer/ - 视图目录
==> 编写邮件程序, 生成邮件内容
# ClassNameMailer > default from: sender@example.com 默认发件人
# ClassNameMailer#methods_name > mail(to: , subject: )
- mail方法会检查两种类型的邮件模版, 生成一个类型为 multipart/alternative 的邮件
==> 具体动作执行要靠控制器
# ClassNameMailer.methods_name(*args).deliver_later
> ActionMailer是基于ActiveJob完成的,因此邮件任务不需要实例化
有关邮件的详细内容单独整理
=end