gpt4 book ai didi

ruby-on-rails - sidekiq 将类作为 args 发送给 stacklevel too deep 错误

转载 作者:太空宇宙 更新时间:2023-11-03 18:22:36 24 4
gpt4 key购买 nike

设置后sidekiq ,我观察到关于传递给 Sidekiq::Client.push 方法的参数的奇怪行为

如果我将 self.class 作为参数,那么我要么得到一个 SystemStackError(堆栈级别太深),要么服务器挂断,此后不接受任何请求。

Sidekiq::Client.enqueue(ActivityWorker, self.id, self.class)

SystemStackError (stack level too deep):
actionpack (3.2.12) lib/action_dispatch/middleware/reloader.rb:70


Rendered /usr/local/rvm/gems/ruby-1.9.3-p194@restro/gems/actionpack-3.2.12/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.0ms)
Rendered /usr/local/rvm/gems/ruby-1.9.3-p194@restro/gems/actionpack-3.2.12/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (2.0ms)
Rendered /usr/local/rvm/gems/ruby-1.9.3-p194@restro/gems/actionpack-3.2.12/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (37.8ms)

但是如果我给 self.class.name 那么它就没有任何缺陷。Sidekiq::Client.enqueue(ActivityWorker, self.id, self.class.name)

我发现 args 在传递给 worker 之前是序列化的,但我无法弄清楚这种情况。

这是我的 Worker 类

class ActivityWorker
include Sidekiq::Worker
sidekiq_options queue: 'high', retry: false

def perform(res_id, res_class)
# do some activity
end
end

最佳答案

你不应该使用像类对象这样的参数来排队作业。它应该是简单的类型,例如字符串、数字、哈希和它们的数组。

对于大多数类,除了我提到的特殊类和其他一些类,Sidekiq 将此参数序列化为 redis,就像空哈希一样。因此无法将其反序列化回您的类。

我建议你将 self.class.name 传递给 enqueue 方法,然后使用 constantize 来获取类来自字符串。

关于ruby-on-rails - sidekiq 将类作为 args 发送给 stacklevel too deep 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15680414/

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