sidekiq active_job Perform_later с текстом, содержащим символы UTF-8

Я только что нашел эту ошибку, когда я звоню

MyJob.perform_later(request.body.read)

с работой sidekiq active_job,

вызов request.body.read возвращает некоторый json, я подумал, что в некоторых случаях он может содержать символы UTF-8 (т.е. символ €),

в этом случае я получаю

Encoding::UndefinedConversionError Exception: "\xE2" from ASCII-8BIT to UTF-8

Я знаю, что sidekiq советует не использовать сложные или длинные параметры задания, что было бы лучшим решением?

что я могу придумать, так это кодировать строку base64 перед передачей ее в задание (но это сделает ее еще длиннее для sidekiq, я не уверен, что это будет проблемой) или сохранить фактический текст json в таблице БД, и просто передайте заданию идентификатор новой строки. это определенно сработает, но мне кажется излишним.

какие-либо предложения?


person Don Giulio    schedule 06.05.2021    source источник


Ответы (1)


Sidekiq собирается использовать JSON.generate для сериализации аргументов задания. Это пример того, что происходит с вашей строкой ASCII-8BIT, которую вы можете запустить в консоли:

arg = "Example with € character".force_encoding('ASCII-8BIT')
JSON.generate([arg])
Encoding::UndefinedConversionError ("\xE2" from ASCII-8BIT to UTF-8)

Одним из вариантов было бы следовать этому ответу и принудительно использовать кодировку UTF-8, прежде чем передавать ее в perform_later. Тогда он будет правильно сериализован:

arg = "Example with € character".force_encoding('ASCII-8BIT')
arg.force_encoding('UTF-8')
JSON.generate([arg])
 => "[\"Example with € character\"]"

Итак, вы хотите что-то вроде:

MyJob.perform_later(request.body.read.force_encoding('UTF-8'))
person cschroed    schedule 14.05.2021