将 Gmail 连接传递给 sidekiq

Pass Gmail Connection to sidekiq

require gmail
gmail = Gmail.connect("testemail@gmail.com", "password")
SidekiqWorker.perform_async(gmail, item.user_id)
gmail.logout()

我想将一个对象传递给 sidekiq,它是一个 gmail 客户端对象,我不想在执行方法中创建该对象,所以我以字符串格式传递它,我正在接受开放结构的帮助来传递它, 但它采用字符串格式。

#OpenStruct gmail=#Gmail::Client0xbe18230 (abcd@gmail.com) connected>>

有几个问题。我认为上面的代码不会像您预期的那样工作。 SidekiqWork 运行 与其余代码异步。看起来您的代码可能存在竞争条件。您无法控制工作代码 运行 是在 gmail.logout() 调用之前还是之后。

此外,通常不认为将对象作为参数传递给 Sidekiq 作业是最佳做法。参见Sidekiq Best Practices。相反,我可能会考虑从 Sidekiq 作业中建立 gmail 连接。

作为替代方案,您可以考虑在存储 gmail 客户端实例的库 class 中使用 class 方法。您可以像下面这样记住此连接:

 class GmailClient
   def self.connection
     @client ||= Gmail.connect("testemail@gmail.com", "password")
   end
 end