通过 Sidekiq worker 传递给方法时哈希元素为 nil
Hash element is nil when pass to method through Sidekiq worker
当我直接调用方法时,一切正常:
Photo.new.init_albums_comments(group_id: @group.id, owner_id: @group.owner_id, user_id: current_user.id)
但是当我通过 Sidekiq worker 调用此方法时,发生了一些奇怪的事情:
InitPhotoWorker.perform_async(group_id: @group.id, owner_id: @group.owner_id, user: current_user.id)
工人
class InitPhotoWorker
include Sidekiq::Worker
sidekiq_options retry: 3, :queue => :critical
Sidekiq::Logging.logger.level = Logger::DEBUG
def perform(photo_params)
Photo.new.init_albums_comments(photo_params)
end
end
方法:
def init_albums_comments(photo_params)
Rails.logger.debug "#{photo_params}"
Rails.logger.debug "#{photo_params[:owner_id]}"
...
end
在我的日志中,我看到哈希 photo_params 没问题:{"group_id" => "1", "owner_id" => "54454545", "user_id" => "1"}
但是哈希键 :owner_id
的日志显示没有值。它或我有什么问题?
您的哈希似乎有字符串键:
Rails.logger.debug "#{photo_params['owner_id']}"
来自 Sidekiq 文档:
您传递给 perform_async 的参数必须由简单的 JSON 数据类型组成:字符串、整数、浮点数、布尔值、空值、数组和散列。 Sidekiq 客户端 API 使用 JSON.dump 将数据发送到 Redis。 Sidekiq 服务器从 Redis 中提取 JSON 数据并使用 JSON.load 将数据转换回 Ruby 类型以传递给您的执行方法。不要传递符号或复杂的 Ruby 对象(如日期或时间!),因为它们将无法正确地在 dump/load 往返过程中存活下来。
当我直接调用方法时,一切正常:
Photo.new.init_albums_comments(group_id: @group.id, owner_id: @group.owner_id, user_id: current_user.id)
但是当我通过 Sidekiq worker 调用此方法时,发生了一些奇怪的事情:
InitPhotoWorker.perform_async(group_id: @group.id, owner_id: @group.owner_id, user: current_user.id)
工人
class InitPhotoWorker
include Sidekiq::Worker
sidekiq_options retry: 3, :queue => :critical
Sidekiq::Logging.logger.level = Logger::DEBUG
def perform(photo_params)
Photo.new.init_albums_comments(photo_params)
end
end
方法:
def init_albums_comments(photo_params)
Rails.logger.debug "#{photo_params}"
Rails.logger.debug "#{photo_params[:owner_id]}"
...
end
在我的日志中,我看到哈希 photo_params 没问题:{"group_id" => "1", "owner_id" => "54454545", "user_id" => "1"}
但是哈希键 :owner_id
的日志显示没有值。它或我有什么问题?
您的哈希似乎有字符串键:
Rails.logger.debug "#{photo_params['owner_id']}"
来自 Sidekiq 文档:
您传递给 perform_async 的参数必须由简单的 JSON 数据类型组成:字符串、整数、浮点数、布尔值、空值、数组和散列。 Sidekiq 客户端 API 使用 JSON.dump 将数据发送到 Redis。 Sidekiq 服务器从 Redis 中提取 JSON 数据并使用 JSON.load 将数据转换回 Ruby 类型以传递给您的执行方法。不要传递符号或复杂的 Ruby 对象(如日期或时间!),因为它们将无法正确地在 dump/load 往返过程中存活下来。