Передача 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
Другие вопросы по тегам