gpt4 book ai didi

ruby-on-rails - 当插入序列化字段时,sidekiq 的奇怪行为在邮件程序上返回了 jid

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:55 26 4
gpt4 key购买 nike

当我试图将 worker 返回的 jid 推送到模型上的序列化字段时,我遇到了一些奇怪的行为。最好用这段代码解释:

class Foo < ActiveRecord::Base
serialize :jids, Array

def do_job
test_jids = []

jids << "s"
test_jids << "s"
Rails.logger.info("s has been pushed")
Rails.logger.info(jids)
Rails.logger.info(test_jids)

jids << BarWorker.perform_in(10.minutes, self.id)
test_jids << BarWorker.perform_in(10.minutes, self.id)
Rails.logger.info("normal worker has been pushed")
Rails.logger.info(jids)
Rails.logger.info(test_jids)

jids << FooMailer.delay_for(10.minutes).confirm_foo(self)
test_jids << FooMailer.delay_for(10.minutes).confirm_foo(self)
Rails.logger.info("mailer worker id pushed")
Rails.logger.info(jids)
Rails.logger.info(test_jids)

jids
end
end

预期的日志记录:

s has been pushed
["s"]
["s"]

normal worker has been pushed
["s", "6d25faf98b6448a43e1d3bb5"]
["s", "7144ceab11ece07ae352ffb9"]

mailer worker id pushed
["s", "6d25faf98b6448a43e1d3bb5", "54c4634bfc11ec1adad926da"]
["s", "7144ceab11ece07ae352ffb9", "3d0bb94e0411a04ab0339f68"]

实际记录。

s has been pushed
["s"]
["s"]

normal worker has been pushed
["s", "243675806204134e6f05abaa"]
["s", "1444f558d7582df1000c6f4b"]

mailer worker id pushed
["s", "243675806204134e6f05abaa"]
["s", "1444f558d7582df1000c6f4b", "c0878213a8ea5f783c30e666"]

邮件程序的作业 ID 尚未推送到 foo 的 jids 属性中。

在困惑中我有点 hacky 并在 Foo 上写了这个方法

def do_job_with_assignment
test_jids = []

jids << "s"
test_jids << "s"
Rails.logger.info("s has been pushed")
Rails.logger.info(jids)
Rails.logger.info(test_jids)


bar_worker_jid = BarWorker.perform_in(10.minutes, self.id)
jids << bar_worker_jid

test_bar_worker_jid = BarWorker.perform_in(10.minutes, self.id)
test_jids << test_bar_worker_jid
Rails.logger.info("normal worker has been pushed")
Rails.logger.info(jids)
Rails.logger.info(test_jids)

foo_mailer_jid = FooMailer.delay_for(10.minutes).confirm_foo(self)
jids << foo_mailer_jid

test_foo_mailer_jid = FooMailer.delay_for(10.minutes).confirm_foo(self)
test_jids << test_foo_mailer_jid
Rails.logger.info("mailer worker id pushed")
Rails.logger.info(jids)
Rails.logger.info(test_jids)

jids
end

现在这确实产生了预期的日志记录。

除了显而易见的,两者之间还有什么区别?

编辑:

没有人领取赏金,我想更进一步,但我不确定问题出在哪里。有人建议一个好的起点吗?

编辑:类

> Foo.new.jids.class
=> Array

> BarWorker.perform_in(10.minutes, 1).class
=> String

> FooMailer.delay_for(10.minutes).confirm_foo(self).class
=> String

编辑:

演示应用程序。 https://github.com/richkettle/sidekiq-oddities

最佳答案

我认为这是因为 Rails 缓存了除序列化字段之外的所有列类型的属性。当您调用 << 时请记住这一点jids 的 getter 方法然后 Rails 获取该字段的属性,但是当您传递 self 时当在 Sidekiq 中序列化时,这再次调用 getter 到邮件程序中,并覆盖属性实例,因此返回值不会添加到正确的 jids 实例。

我不确定我是否完全理解为什么会发生这种情况,因此一些具体的实现细节可能不太准确!

可以通过以下方式之一修复/使其与此版本的 Rails (4.1.5) 一起使用:

缓存jids属性:

class Foo < ActiveRecord::Base
serialize :jids, Array
cache_attributes :jids

使用 jids setter :

jids = self.jids << FooMailer.delay_for(10.minutes).confirm_foo(self)

传递 id或复制到邮件中:

jids << FooMailer.delay_for(10.minutes).confirm_foo(id)
# or
jids << FooMailer.delay_for(10.minutes).confirm_foo(self.dup)

重写此代码后,此问题已在 Rails 4.2 中修复,我可以在此处找到一个 PR:https://github.com/rails/rails/pull/15429

关于ruby-on-rails - 当插入序列化字段时,sidekiq 的奇怪行为在邮件程序上返回了 jid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28897510/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com