You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails中wisper-sidekiq异步任务失效求助

解决方案:解决wisper-sidekiq异步广播时的Psych::DisallowedClass错误

问题原因

Sidekiq 6.0+默认启用了严格的YAML反序列化安全策略,仅允许预定义的类被反序列化。当wisper-sidekiq以async: true模式广播事件时,会将监听器类(Listener::Studentlistener)序列化存储到Redis,但该类不在Sidekiq的允许列表中,因此触发Psych::DisallowedClass错误。而async: false是同步执行,不需要序列化,所以能正常运行。

具体修复步骤

1. 配置Sidekiq允许目标监听器类

在config/initializers/sidekiq.rb文件中添加允许类的配置:

Sidekiq.configure_server do |config|
  config.redis = { url: ENV['REDIS_URL'] } # 保留你原有的Redis配置
  # 将你的监听器类加入允许列表
  config.allowed_classes += [Listener::Studentlistener]
end

Sidekiq.configure_client do |config|
  config.redis = { url: ENV['REDIS_URL'] } # 保留你原有的Redis配置
  # 客户端也需要同步配置,避免序列化时出错
  config.allowed_classes += [Listener::Studentlistener]
end

2. 检查监听器类名的正确性

注意错误信息中的类名是Studentlistener(小写l结尾),确认你的实际类名是否与之完全一致。如果是拼写错误(比如应该是StudentListener),需要统一修正类名及引用处,否则即使添加到允许列表也会找不到类。

3. 确保监听器类被Sidekiq服务器加载

如果你的监听器类位于非Rails默认自动加载目录(比如自定义的app/listeners),需要在config/application.rb中添加自动加载路径:

config.autoload_paths += %W(#{config.root}/app/listeners)

或者在Sidekiq初始化器中手动引入类:

require 'listener/studentlistener'

完成上述配置后,重启Sidekiq和Rails服务器,即可正常使用async: true模式广播事件。

内容的提问来源于stack exchange,提问作者m.sahil Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:52:08