【发布时间】:2019-10-13 00:32:07
【问题描述】:
我使用以下代码构建了一个 ZIP 文件:
def compress_batch(directory_path)
zip_file_path = File.join( File.expand_path("..", directory_path), SecureRandom.hex(10))
Zip::File.open(zip_file_path, Zip::File::CREATE) do |zip_file|
(Dir.entries(directory_path) - %w(. ..)).each do |file_name|
zip_file.add file_name, File.join(directory_path, file_name)
end
end
result = File.open(zip_file_path, 'rb').read
File.unlink(zip_file_path)
result
end
我将该 ZIP 文件存储在内存中:
@result = Payoff::DataFeed::Compress::ZipCompress.new.compress_batch(source_path)
我把它放入哈希中:
options = {
data: @result
}
然后我使用perform_async 将其提交给我的 SideKiq 工作人员:
DeliveryWorker.perform_async(options)
并得到以下错误:
[DEBUG] Starting store to: { "destination" => "sftp", "path" => "INBOUND/20191009.zip" }
Encoding::UndefinedConversionError: "\xBA" from ASCII-8BIT to UTF-8
from ruby/2.3.0/gems/activesupport-4.2.10/lib/active_support/core_ext/object/json.rb:34:in `encode'
但是,如果我使用 .new.perform 而不是 .perform_async,绕过 SideKiq,它可以正常工作!
DeliveryWorker.new.perform(options)
我最好的猜测是我的编码有问题,以至于当工作转到 SideKiq / Redis 时,它会爆炸。我应该如何编码?我是否需要更改 ZIP 文件的创建?也许我可以在提交到 SideKiq 时转换编码?
【问题讨论】:
-
github.com/mperham/sidekiq/wiki/… 当您执行
.new.perform时它会起作用,因为没有任何内容会被序列化为 JSON 并推送到 Redis - 直接调用该作业。
标签: ruby encoding redis sidekiq