2016-01-27 117 views
1
require gmail 
gmail = Gmail.connect("[email protected]", "password") 
SidekiqWorker.perform_async(gmail, item.user_id) 
gmail.logout() 

我想传递一个对象到sidekiq,它是一个gmail客户端对象,而且我不想在执行方法中创建该对象,所以我传递并将它传入字符串中格式,我正在借助开放结构来传递它, 但是它以字符串格式进行。通过Gmail连接到sidekiq

#OpenStruct gmail=#Gmail::Client0xbe18230 ([email protected]) connected>> 
+0

任何人都可以建议我一些解决方案,我怎么可以传递连接到sidekiq? – AJinkya

+0

如果从Web服务器到将在Redis中序列化存储的外部服务的打开连接在工作器机器上反序列化时仍然可以工作,我会感到惊讶。我至少希望连接不再工作或者关闭,因为它被中断,在内存中不存在一段时间,甚至可能移动到不同的服务器。为什么你要尽量避免在工作人员中建立连接? – spickermann

回答

3

有几个问题。我不认为上面的代码会按照你的意图工作。 SidekiqWork与其余代码异步运行。它看起来像你的代码可能会受到竞争条件。您无法控制工号码在gmail.logout()呼叫之前还是之后运行。

此外,将对象作为参数传递给Sidekiq作业通常不被视为最佳做法。请参阅Sidekiq Best Practices。相反,我可能会考虑在Sidekiq作业中创建gmail连接。

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

class GmailClient 
    def self.connection 
    @client ||= Gmail.connect("[email protected]", "password") 
    end 
end 
+0

作为第三种替代方案,Sidekiq作业可能会调用方法,在作业完成后关闭连接。 _Sidenote_:请在回答中提及参数按预期方式传递,而不是字符串,它只显示为一个字符串。 – mudasobwa