开发中涉及到调用三方服务API,运行时间长,结果不需要实时反馈给用户这样的任务,都可以使用异步处理。常见的场景包括:发邮件和短信、图片处理、定时清理等、爬虫。

后端处理软件可以自行选择这里选择了sidekiq

Active Job 设置

全局设定

class Application < Rails::Application
# ...
config.active_job.queue_adapter = :sidekiq
end

局部设定

class GuestsCleanupJob < ApplicationJob
self.queue_adapter = :resque
#....
end # 现在,这个作业使用 `resque` 作为后端队列适配器
# 把 `config.active_job.queue_adapter` 配置覆盖了

之后我们可以根据需要生成相应的job

rails generate job Example

这条命令会生成/app/jobs/example_job.rb

class ExampleJob < ActiveJob::Base
# Set the Queue as Default
queue_as :default def perform(*args)
# Perform Job
end
end

怎么使用这个job呢?

ExampleJob.perform_later args

这样这个job就会被加入到队列中,加入到队列中就会被等待执行。如果出现了错误,sidekiq会在之后进行重试。

还有几种入队作业

# 入队作业,作业在队列系统空闲时立即执行
GuestsCleanupJob.perform_later guest # 入队作业,在明天中午执行
GuestsCleanupJob.set(wait_until: Date.tomorrow.noon).perform_later(guest) # 入队作业,在一周以后执行
GuestsCleanupJob.set(wait: 1.week).perform_later(guest) # `perform_now` 和 `perform_later` 会在幕后调用 `perform` 因此可以传入任意个参数
GuestsCleanupJob.perform_later(guest1, guest2, filter: 'some_filter') # `perform_now` 代码会立即执行,在这开发环境会很实用。
MyJob.new(*args).perform_now
MyJob.perform_now("mike")

队列

多数适配器支持多个队列,默认使用的 queue_name 是 default。Active Job 允许把作业调度到具体的队列中:

class GuestsCleanupJob < ApplicationJob
queue_as :low_priority
#....
end

队列名称可以使用 application.rb 文件中的 config.active_job.queue_name_prefix 选项配置前缀。

默认的队列名称前缀分隔符是 _。这个值可以使用 application.rb 文件中的 config.active_job.queue_name_delimiter 选项修改。

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

# config/application.rb
module YourApp
class Application < Rails::Application
config.active_job.queue_name_prefix = Rails.env
config.active_job.queue_name_delimiter = '.'
end
end # app/jobs/guests_cleanup_job.rb
class GuestsCleanupJob < ApplicationJob
queue_as :low_priority
queue_with_priority 50 def perform(post)
post.to_feed!
end
end # 在生产环境中,作业在 production.low_priority 队列中运行
# 在交付准备环境中,作业在 staging.low_priority 队列中运行

控制

Active Job 在作业的生命周期内提供了多个钩子。回调用于在作业的生命周期内触发逻辑。可用的回调:

  • before_enqueue
  • around_enqueue
  • after_enqueue
  • before_perform
  • around_perform
  • after_perform
class GuestsCleanupJob < ApplicationJob
queue_as :default before_enqueue do |job|
# 对作业实例做些事情
end around_perform do |job, block|
# 在执行之前做些事情
block.call
# 在执行之后做些事情
end def perform
# 稍后做些事情
end
end

Active Job 基础的更多相关文章

  1. 2.7w字!Java基础面试题/知识点总结!(2021 最新版)

    这篇<Java 基础知识总结>是 JavaGuide 上阅读量最高的一篇文章,由于我对其进行了重构完善并且修复了很多小问题,所以,在博客园再同步一下! 文章内容比较多,目录如下: 基础概念 ...

  2. 【Pro ASP.NET MVC 3 Framework】.学习笔记.11.ASP.NET MVC3的细节:概览MVC项目

    书Adam The Definitive Guide to HTML5 Adam Applied ASP.NET 4 in Context and Pro ASP.NET 4 到此为止,我们已经学了为 ...

  3. 通过SCVMM分配SMB 3.0 文件共享

    1.创建SMB群集共享,赋予Hyper-V主机. Hyper-V群集名称.Hyper-V管理员.Hyper-V服务账户完全控制权限 2.VMM提供程序导入 文件服务器(运行方式账户要对文件服务器群集的 ...

  4. Windows Azure 安全最佳实践 - 第 5 部分:基于Claim 的标识,单点登录

    基于Claim的身份标识是处理网站与 Web 服务的身份认证和访问一种简单而强大的方式,无论您是在本地工作还是面向云工作.您可以通过减少自定义实施和使用基于Claim的单一简化标识模型,创建更安全的应 ...

  5. 利用Azure虚拟机安装Dynamics 365 Customer Engagement之二:创建域控虚拟机

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  6. Windows Azure Active Directory (2) Windows Azure AD基础

    <Windows Azure Platform 系列文章目录> Windows Azure AD (WAAD)是Windows Azure提供的一个REST风格的服务,为您的云服务提供了身 ...

  7. Bootstrap3基础 warning/active... 表格的状态类(不同的背景色)

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  8. 【tensorflow基础】ubuntu-tensorflow可视化工具tensorboard-No dashboards are active for the current data set.

    前言 今天基于tensorflow训练一个检测模型,本应看到训练曲线的,却只见到一个文件events.out.tfevents.1570520647.hostname,后来发现这个文件可以查看训练曲线 ...

  9. web前端基础知识

    #HTML    什么是HTML,和他ML...    网页可以比作一个装修好了的,可以娶媳妇的房子.    房子分为:毛坯房,精装修    毛坯房的修建: 砖,瓦,水泥,石头,石子....    精 ...

随机推荐

  1. 【SQL重温】面试之数据库基础练习

    简介 最近在练习SQL基础,首先感叹一下,在机器上写和在纸上写还是有区别的. 本文的练习题目请点击此链接进行查看:http://www.cnblogs.com/edisonchou/p/3878135 ...

  2. 高精度定时器实现 z

    1背景Permalink .NET Framework 提供了四种定时器,然而其精度都不高(一般情况下 15ms 左右),难以满足一些场景下的需求. 在进行媒体播放.绘制动画.性能分析以及和硬件交互时 ...

  3. npm install warning: no description; no repository field

    npm install 报错:warning no description; no repository field 开始以为必须npm init,npm init在git bash(win7)里,还 ...

  4. iptables:no config file

    防火墙规则默认都是在/etc/sysconfig/iptables这个文件中的 出现这个问题,是因为在/etc/sysconfig/目录下没有找到iptables这个文件 可以使用service ip ...

  5. Linux配置临时IP和网关命令

    配置IP以及子网掩码: ifconfig eth0 192.168.1.33  netmask  255.255.255.0 up 设置网关: route add default gw 192.168 ...

  6. C++实现线性表的链接存储结构(单链表)

    将线性表的抽象数据类型定义在链接存储结构下用C++的类实现,由于线性表的数据元素类型不确定,所以采用模板机制. 头文件linklist.h #pragma once #include <iost ...

  7. linux oom-killer

    本人从事UTM的开发工作,最近遇到out of memory killer.这里整理一下资料. 简述 当系统内存不足时,系统会触发 oom-killer.oom-killer的机制就是选择杀掉最适合的 ...

  8. 索引反向使用案例,加index_desc hint

    drop index idx_t;create index idx_t on t(owner desc,object_type asc); select /*+index(a,idx_t)*/ * f ...

  9. VMware workstation 虚拟机安装帮助文档(以windows server 2003为例)

    本次安装以Windows server 2003为例: 1.在桌面上双击VMware快捷方式打开,并点击文件>新建虚拟机 2.这里选择默认的“典型”,点击下一步 3.选择浏览,找到windows ...

  10. 使用Fragment实现Tab效果

    在上一篇中,我们将了使用ViewPager实现Tab效果.如果没有阅读过,可以点击下面的地址: http://www.cnblogs.com/fuly550871915/p/4849893.html ...