Active Job 使用

Queue Adapter

定义:配置使用哪种后端任务、队列管理方式。默认使用的 queue_adapter 是 :inline,处理方式是立即执行任务。你需要自己设置 queue_adapter.

ActiveJob::Base.queue_adapter = :inline
# 或类似
Rails.application.config.active_job.queue_adapter = :test

已经支持 Resque、Sidekiq、Delayed Job 等常用延迟任务 gem,所有可用 adapter:

:backburner, :delayed_job, :qu, :que, :queue_classic,
:resque, :sidekiq, :sneakers, :sucker_punch,
:inline, :test

Queue Name

定义:任务都是先进队列里,队列都有名字的,方便管理。默认使用的 queue_name 是 "default"

可以定制:

class MyJob < ActiveJob::Base
  queue_as :my_jobs

  def perform(record)
    # ...
  end
end

通过 config.active_job.queue_name_prefix= 可给所有队列名加前缀。

Queue Priority

定义:队列有优先级这个属性,优先级高的会被先执行。类方法 queue_with_priority 可以进行设置,对整个类有效:

可用实例方法 priority 获取,由上面统一设置的。

Core

调用:设置任务所在队列、队列优先级行。类方法 set 使用举例:

set 支持可选参数::wait、:wait_until、:queue、:priority,它的具体实现由 ConfiguredJob 完成,主要是处理各个参数,起到配置作用。

Note:可以不使用 set 直接调用 perform_later 进队列,然后等待执行。

类方法:

实例方法:

它们只是后端任务信息的一种方式,在此不必深究。

Enqueuing 入队与重试

调用。

常用方法:

使用举例:

入队列、执行任务失败,捕捉后,还可以重试:

使用举例:

除上述两实例方法外,还有类方法:

Execution 执行

调用。

使用举例:

使用 perform_now 代码会立即执行,在这开发环境会很实用。

Callbacks 回调

定义 + 自动调用。

比某些延迟 gem 多做了一点点,除了队列&执行本身外,还可以有回调:

使用举例:

其它几个方法类似。

Note: 实现上,使用了 ActiveSupport::Callbacks 的 define_callbacks、set_callback、run_callbacks 等方法。

提示

创建任务、进队列、执行任务这几个步骤,尽管我们可以区分开,但很多时候它们是交织在一起的(从 API 上就能看出),我们可以不严格区分。

使用 Active Job 有利必有弊,可能面临以下问题:

原 gem 本身的特性没能充分发挥,灵活性降低,和其它 gem 的集成会变复杂。

最后更新于

这有帮助吗?