2016-01-27 150 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