Я создаю 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
}
Затем я отправляю его своему работнику SideKiq, используя perform_async
:
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?