【发布时间】:2014-12-08 07:02:50
【问题描述】:
我正在使用sidekiq 执行一些后台工作,但是在将参数传递给sidekiq's 工人类的perform 方法时有些疑问。
场景:
一旦用户进入我的应用程序,我就会将日志信息存储到我的模型user_sessions。
像往常一样在我的控制器中执行专用操作。但是在向用户显示信息后,我需要执行一些额外的操作,并且需要更新user_session 模型中的一列。
提到here的以下程序
第 1 步:将 gem 'sidekiq' 添加到 gem 文件中。
第 2 步:安装 'redis' gem。
第 3 步:捆绑安装
第四步:
class MyController < ApplicationController
def MyAction
#perform dedicated action
@info = #render data to user
param1 = #parameter to find in user_session model(its a string.i don't get id of model here)
param2 = #extra param to perform task
UpdateWorker.perform_async(param1,param2)
end
end
第 5 步:在 app 文件夹下创建一个工作文件夹。
class UpdateWorker
include Sidekiq::Worker
def perform(param1,param2)
puts "======> updating "
#retrieve `user_session` based on param1(note: param1 is not an id)
#perform update functions
UserSession.update_attribute(:column, value)
end
end
第6步:开始rails server
第 7 步:在另一个标签页中启动 bundle exec sidekiq
错误NoMethodError (undefined method 'key?' for JSON::Ext::Generator::State:0x007f1b......
【问题讨论】:
-
我需要降级我的多json版本吗?
-
所以首先要做的就是在Controller中记录param1和param2的类型。几乎可以肯定,您将一个复杂的、不可序列化的对象传递给 Sidekiq。
-
@PeterGoldstein 作为一个新手,我对你的评论知之甚少。你能解释一下吗?请?
-
在控制器中,在 UpdateWorker 行之前添加以下内容 -
logger.error "Param 1: #{param1.class.name} Param2: #{param2.class.name}"。这将准确地告诉您传递给 UpdateWorker.perform 方法的内容。 -
并且您确定没有旧作业在您不使用字符串和整数的地方闲逛? Redis 是空的?您可以使用 Sidekiq Web UI 确认这一点。
标签: ruby-on-rails ruby-on-rails-4 sidekiq