0

我很难相信我所看到的,但看起来 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异常。

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

4

1 回答 1

0

好吧,这花了我大约一周的时间才弄清楚,所以我在这里发布它以帮助其他陷入这个陷阱的人。原来这是delayed_job_mongoid 中的一个已知错误。它在错误报告中列出了 10 个月的简单修复。

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

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

于 2013-04-23T17:34:45.977 回答