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

我想将一个对象传递给 sidekiq,它是一个 gmail 客户端对象,我不想在 perform 方法中创建该对象,所以我要传递它并以字符串格式传递,我正在借助 open struct通过它,但它以字符串格式进行。

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

1 回答 1

3

有几个问题。我认为上面的代码不会按您的意愿工作。SidekiqWork 与其余代码异步运行。看起来您的代码可能会受到竞争条件的影响。您无法控制工作人员代码是在gmail.logout()调用之前还是之后运行。

此外,将对象作为参数传递给 Sidekiq 作业通常不被认为是最佳实践。请参阅Sidekiq 最佳实践。相反,我可能会考虑在 Sidekiq 工作中建立 gmail 连接。

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

 class GmailClient
   def self.connection
     @client ||= Gmail.connect("testemail@gmail.com", "password")
   end
 end
于 2016-01-27T06:50:44.983 回答