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
相关产品推荐
相关产品推荐

