将选项哈希传递给sidekiq worker

问题描述 投票:11回答:2

我记得当我尝试将params(JSON)选项传递给sidekiq worker方法时,它没有很好用,因为我引用了以下选项:

options[:email_address]

但我认为如果我这样做会有效:

options["email_address"]

因此,出于某种原因,当它被序列化和反序列化时,哈希只能用字符串而不是符号来引用。

这是一种安全的做法吗?

我有一个交易电子邮件工作者,看起来像:

class TransactionEmailWorker
    include Sidekiq::Worker

  def perform(action, options)
    case action
    when 'welcome'
      welcome(options["email_address"], options["something_else"])
    when 'reset_password'
      reset_password(options["email_address"])
    end
  end

  def welcome(email, title)
    # ...
  end

  def reset_password(email)
   # ..
  end
ruby-on-rails sidekiq
2个回答
13
投票

这就是Sidekiq wiki page所说的:

传递给perform_async的参数必须由简单的JSON数据类型组成:string,integer,float,boolean,null,array和hash。 Sidekiq客户端API使用JSON.dump将数据发送到Redis。 Sidekiq服务器从Redis中提取JSON数据并使用JSON.load将数据转换回Ruby类型以传递给您的perform方法。不要传递符号,命名参数或复杂的Ruby对象(如Date或Time!),因为这些对象无法正确转储/加载往返。

传递Ruby哈希是有效的,因为它能够序列化为有效的JSON。所以回答你的问题,这是安全的做法。

serialized_args = JSON.dump({email_address: "[email protected]", something_else: "thing"})
=> "{\"email_address\":\"[email protected]\",\"something_else\":\"thing\"}"

JSON.load(serialized_args)
=> {"email_address"=>"[email protected]", "something_else"=>"thing"}

© www.soinside.com 2019 - 2024. All rights reserved.