Передача Gmail Connection в sidekiq
require gmail
gmail = Gmail.connect("testemail@gmail.com", "password")
SidekiqWorker.perform_async(gmail, item.user_id)
gmail.logout()
Я хочу передать объект в sidekiq, это клиентский объект gmail, и я не хочу создавать этот объект в методе execute, поэтому я передаю его в формате строки, я обращаюсь за помощью к открытой структуре, чтобы передать, но это происходит в строковом формате.
#OpenStruct gmail=#Gmail::Client0xbe18230 (abcd@gmail.com) connected>>
1 ответ
Есть пара вопросов. Я не думаю, что приведенный выше код будет работать так, как вы собираетесь. SidekiqWork запускается асинхронно с остальным кодом. Похоже, ваш код может быть предметом гонки. Вы не можете контролировать, выполняется ли рабочий код до или после gmail.logout()
вызов.
Кроме того, обычно не рекомендуется передавать объект в качестве аргумента в задание Sidekiq. Ознакомьтесь с рекомендациями Sidekiq. Вместо этого я мог бы рассмотреть возможность подключения к gmail из задания Sidekiq.
В качестве альтернативы вы можете рассмотреть возможность использования метода класса в классе lib, который хранит экземпляр клиента gmail. Вы можете запомнить это соединение следующим образом:
class GmailClient
def self.connection
@client ||= Gmail.connect("testemail@gmail.com", "password")
end
end