ActiveJob:在没有完整的工作类别的情况下如何执行简单的操作?

雅各布

使用delayed_job,我可以执行以下简单操作:

@foo.delay.increment!(:myfield)

Rails的新ActiveJob是否可以做同样的事情?(无需创建一堆执行这些小操作的作业类)

D面

ActiveJob只是在各种后台作业处理器之上的抽象,因此许多功能取决于您实际使用的提供者但是,我将尽量不依赖任何后端。

通常情况下,工作提供者包括持久性机制亚军当卸载工作时,您以某种方式将其写入持久性机制,然后稍后一个运行者检索并运行它。所以问题是:您能否以与您需要的任何操作兼容的格式来表达您的工作数据

那将是棘手的。

然后定义什么是工作定义。例如,它可以是单个方法调用。假设这种语法:

Model.find(42).delay.foo(1, 2)

我们可以使用以下格式:

{
  class: 'Model',
  id: '42', # whatever
  method: 'foo',
  args: [
    1, 2
  ]
}

现在,我们如何从给定的调用中构建这样的哈希并将其排队到作业队列中?

首先,看上去,我们需要定义一个类method_missing以捕获被调用的方法名:

class JobMacro
  attr_accessor :data
  def initialize(record = nil)
    self.data = {}
    if record.present?
      self.data[:class] = record.class.to_s
      self.data[:id]    = record.id
    end
  end
  def method_missing(action, *args)
    self.data[:method] = action.to_s
    self.data[:args] = args
    GenericJob.perform_later(data)
  end
end

工作本身必须像下面这样重构该表达式:

data[:class].constantize.find(data[:id]).public_send(data[:method], *data[:args])

当然,您必须delay在模型上定义宏。最好将其分解为模块,因为定义非常通用:

def delay
  JobMacro.new(self)
end

它确实有一些限制:

  • 仅支持在持久化ActiveRecord模型上运行的作业。一项工作需要一种重构被调用者以调用该方法的方法,我选择了最可能的方法。如果需要,也可以使用封送处理,但是我认为这是不可靠的:在执行作业之前,未封送处理的对象可能无效。与“ GlobalID”相同。
  • 它使用Ruby的反射。这是解决许多问题的诱人解决方案,但是它并不快,并且在安全性方面有点冒险。因此,请谨慎使用此方法。
  • 仅一个方法调用。没有procs(您可能可以使用ruby2rubygem做到这一点)。依靠作业提供者正确地序列化参数,如果失败,可以使用您自己的代码来帮助它。例如,在que内部使用JSON,因此无论是在JSON中工作,还是在中工作que例如,符号没有。

起初,事情将以惊人的方式破裂。
因此,请确保在开始之前设置调试工具。


一个示例是Sidekiq对ActiveRecord的向后(Delayed :: Job)兼容性扩展

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Java中,如何在没有完整路径的情况下执行外部应用

来自分类Dev

如何在没有静态变量的情况下使简单的递归函数正常工作

来自分类Dev

我有一个类别。如何在没有其他宝石的情况下打印所有子类别的文章?滑轨

来自分类Dev

在没有ID或类别的情况下,单击更改按钮的值

来自分类Dev

如何在没有for循环的情况下执行此操作

来自分类Dev

在没有两个查询的情况下如何在Knex中执行此操作

来自分类Dev

如何执行更新否则插入操作将在没有MERGE语句的情况下赢得INFORMIX

来自分类Dev

如何在Shell脚本中没有“ awk”的情况下执行此操作

来自分类Dev

Java泛型,如何在没有instanceof或强制转换的情况下执行此操作?

来自分类Dev

如何在没有for循环的情况下对矩阵的每一行执行操作?

来自分类Dev

Matlab:如何在没有暴力for循环的情况下执行行操作?

来自分类Dev

如何在没有sudo的情况下执行'iftop'

来自分类Dev

没有大量IF的情况下如何控制执行?

来自分类Dev

如何在没有警告的情况下执行resolvconf?

来自分类Dev

Postgres 10 sql 如何在没有所有列的情况下执行不同的操作

来自分类Dev

Ubuntu 16.04 ubuntu-make android错误:在没有类别的情况下,系统要求使用默认类别的Android框架

来自分类Dev

如何在没有嵌入式订阅的情况下执行一个异步操作

来自分类Dev

在没有IDE的情况下执行C程序的简单方法

来自分类Dev

在没有IDE的情况下执行C程序的简单方法

来自分类Dev

在没有完整路径的情况下运行ls

来自分类Dev

在没有完整网络配置的情况下引导网络

来自分类Dev

AFNetworking 是在没有完整位码的情况下构建的

来自分类Dev

在没有任何人“知道”它的情况下执行异步操作可以吗?

来自分类Dev

setLocation在操作中仅在没有整数增量的情况下才执行更改按钮的位置

来自分类Dev

如何在没有提交或挂钩的情况下获取网络表单标题和类别?

来自分类Dev

如何在没有完整路径的情况下从git status快速引用文件

来自分类Dev

如何强制cmake在没有完整路径的情况下使用cl.exe?

来自分类Dev

在没有操作员的情况下实施操作

来自分类Dev

如何在没有“新”操作的情况下实施“创建”操作

Related 相关文章

  1. 1

    在Java中,如何在没有完整路径的情况下执行外部应用

  2. 2

    如何在没有静态变量的情况下使简单的递归函数正常工作

  3. 3

    我有一个类别。如何在没有其他宝石的情况下打印所有子类别的文章?滑轨

  4. 4

    在没有ID或类别的情况下,单击更改按钮的值

  5. 5

    如何在没有for循环的情况下执行此操作

  6. 6

    在没有两个查询的情况下如何在Knex中执行此操作

  7. 7

    如何执行更新否则插入操作将在没有MERGE语句的情况下赢得INFORMIX

  8. 8

    如何在Shell脚本中没有“ awk”的情况下执行此操作

  9. 9

    Java泛型,如何在没有instanceof或强制转换的情况下执行此操作?

  10. 10

    如何在没有for循环的情况下对矩阵的每一行执行操作?

  11. 11

    Matlab:如何在没有暴力for循环的情况下执行行操作?

  12. 12

    如何在没有sudo的情况下执行'iftop'

  13. 13

    没有大量IF的情况下如何控制执行?

  14. 14

    如何在没有警告的情况下执行resolvconf?

  15. 15

    Postgres 10 sql 如何在没有所有列的情况下执行不同的操作

  16. 16

    Ubuntu 16.04 ubuntu-make android错误:在没有类别的情况下,系统要求使用默认类别的Android框架

  17. 17

    如何在没有嵌入式订阅的情况下执行一个异步操作

  18. 18

    在没有IDE的情况下执行C程序的简单方法

  19. 19

    在没有IDE的情况下执行C程序的简单方法

  20. 20

    在没有完整路径的情况下运行ls

  21. 21

    在没有完整网络配置的情况下引导网络

  22. 22

    AFNetworking 是在没有完整位码的情况下构建的

  23. 23

    在没有任何人“知道”它的情况下执行异步操作可以吗?

  24. 24

    setLocation在操作中仅在没有整数增量的情况下才执行更改按钮的位置

  25. 25

    如何在没有提交或挂钩的情况下获取网络表单标题和类别?

  26. 26

    如何在没有完整路径的情况下从git status快速引用文件

  27. 27

    如何强制cmake在没有完整路径的情况下使用cl.exe?

  28. 28

    在没有操作员的情况下实施操作

  29. 29

    如何在没有“新”操作的情况下实施“创建”操作

热门标签

归档