【问题标题】:Storing data in a job for use when it is performed将数据存储在作业中以供执行时使用
【发布时间】:2015-02-08 20:13:29
【问题描述】:

我需要在计划使用活动作业时存储信息,以便稍后执行。我想将此信息保存在活动作业本身中,但我不确定这是否可能。

这是我正在尝试的简化版本,它重现了我看到的错误:

class TestJob < ActiveJob::Base
  queue_as :default

  attr_reader :save_for_later

  def initialize(info)
    @save_for_later = info
  end


  def perform()
    logger.info(@save_for_later)
  end
end

class CollectionsController < ApplicationController
  def schedule_test_job
    TestJob.perform_later(Date.new)
  end
end

当我在 Collections 控制器中调用 schedule_test_job 时,我收到一个错误: nil:NilClass 的未定义方法“map” 并且不会调用执行操作。

我假设我需要将我试图保存在数据库其他位置的信息持久化,但我想知道是否有适当的方法来完成我在这里所做的事情。我也不明白抛出的错误是从哪里来的。

【问题讨论】:

  • 你从哪里得到这个错误?这可能是因为您不应该覆盖初始化,因为它也会执行其他一些操作。您可以将日期作为作业参数传递,因为它将被持久化,但将其作为数字传递,因为 ActiveJob 只接受基本类型(可以轻松序列化/反序列化)。您可以使用i=Time.current.to_iTime.at(i)
  • @bcd 调用控制器中的函数schedule_test_job时出错。关于初始化需要做其他事情的观点,如果我在初始化块的末尾添加对 super() 的调用,这个错误确实会消失。

标签: ruby-on-rails rails-activejob


【解决方案1】:

其实所有的job参数都是传给perform的,所以你要写:

class TestJob < ActiveJob::Base
  def perform(date)
    logger.info(date)
  end
end

TestJob.perform_later(Date.new)

第二个问题是 Date 不能被 ActiveJob AFAIK 序列化。但是您可以轻松地传递一个字符串,然后解析日期;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2017-12-19
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多