【问题标题】:Delayed Job object not properly deserialized延迟作业对象未正确反序列化
【发布时间】:2013-04-24 01:34:45
【问题描述】:

我很难相信我所看到的,但看起来 DJ 确实无法正确反序列化对象。我查看了 mongo 中的 DJ 记录,并在 YAML 中看到该对象设置了其text 字段,但是当代码运行时,text 字段未设置。这是一些最小的复制代码:

class Board
    include Mongoid::Document
    field :text, type: String

    def process_text_field
        if not self.text
            raise "Text field is blank"
        end
        # Text field gets processed
    end
end

# in a controller
def start_doing_something_slow
    board = Board.find(params[:id])
    board.text = "Text field is set"
    board.save!
    raise "Text disappeared!" unless board.text
    board.delay.process_text_field
    render json: {:result=>'ok'}
end

我用浏览器调用控制器方法,直接在mongo中查看DJ记录。我在 YAML 中看到 Board 对象正确设置了 text 字段。但是当它在 DJ 中执行时,它会引发 Text field is blank 异常。

不知何故,它没有正确反序列化对象。

【问题讨论】:

    标签: ruby-on-rails mongoid delayed-job


    【解决方案1】:

    嗯,这花了我大约一周的时间才弄清楚,所以我把它贴在这里是为了帮助其他陷入这个陷阱的人。原来这是 delay_job_mongoid 中的known bug。并且它已经在错误报告中列出了 10 个月的简单修复。

    如果您在 mongoid 中使用身份映射,则会出现问题,它充当数据库的进程内缓存层。对于正常的 Web 请求,缓存会在每个请求之间被清除,因此您的控制器方法不会使用对象的陈旧版本。但是没有这个补丁(我只是把它放在一起),delayed_job_mongoid 不会清除作业之间的缓存:https://github.com/collectiveidea/delayed_job_mongoid/pull/38

    结果是您的延迟作业有时会使用旧版本的对象,这取决于它们之前运行的内容,这会产生真正奇怪、神秘的故障,在您了解发生了什么之前很难追踪这些故障。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-08
      • 2011-06-28
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多