【问题标题】:Arguments to sidekiq worker methodsidekiq worker 方法的参数
【发布时间】: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......

正如提到的herehere 我需要在参数中传递对象的ID。 至于我的情况,谁能建议我如何解决我的问题?

【问题讨论】:

  • 我需要降级我的多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


【解决方案1】:

这样会更好:

array = [param1,param2]

UpdateWorker.perform_async(array)

现在在worker中你可以使用数组了

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多