2011-04-09 83 views
1

我正在嘗試構建一個(私人的,現在的)Web應用程序,它將利用IMAP IDLE連接在他們到達時顯示人們的電子郵件。Ruby IMAP IDLE併發 - 如何解決?

我有一個很難搞清楚如何共同破解這一點 - 它是如何將我的Heroku的回報率服務器配合在一起。

我寫了一個基本的腳本,用於連接到IMAP服務器和怠速時,看起來像這樣(簡化):

imap = Net::IMAP.new server, port, usessl 
imap.login username, password 
imap.select "INBOX" 

imap.add_response_handler do |response| 
    if resp.kind_of(Net::IMAP::UntaggedResponse) && resp.name == "EXISTS" 
    # New mail recieved. Ping back and process. 
    end 
end 

imap.idle 
loop do 
    sleep 10*60 
    imap.renew_idle 
end 

這將使一個連接到IMAP服務器,並開始空轉。正如你所看到的,這是循環阻塞的。

我想有多個IMAP連接在同一時間爲我的用戶空轉。最初,我只是希望把他們每個人在一個線程,就像這樣:

Thread.new do 
    start_imap_idling(server, port, usessl, username, password) 
end 

我不是線程銳還,但這種解決方案我仍然要擋住我的主線程等待線程?所以,如果我做這樣的事情:

User.each do |user| 
    Thread.new do 
    start_imap_idling(server, port, usessl, username, password) 
    end 
end 

loop do 
    # Wait 
end 

這將工作,但不是沒有底部的循環,允許線程運行?

我的問題是,如何我最好在Heroku我的Ruby on Rails應用程序融在一起呢?我無法阻止最後一個循環的線程 - 那麼我該如何運行?另一臺服務器更多的測功機 - 也許是一名工人?我一直在閱讀關於Event Machine的一些信息 - 如果可以解決我的問題,我該怎麼寫呢?

另一件事是,我希望能夠在飛行中增加新的IMAP客戶端,並刪除當前值。那看起來怎麼樣?可能有隊列嗎?

任何幫助和意見非常感謝!

+1

絕對看看EventMachine。你可能還需要從heroku畢業。 – 2011-04-14 02:24:40

回答

0

我不熟悉的回報率,活動機等的細節 - 但似乎你想要建立一個生產者/消費者。

製作人是您的線程,正在偵聽來自IMAP服務器的更改。當它得到改變時,它將它們寫入隊列。您似乎想要設置多個生產者,每個IMAP連接一個。

您的使用者是阻塞從隊列中讀取的線程。當某些東西進入隊列時,它會解除阻塞並處理事件。

然後,您的主線程可以自由地做任何你想做的事情。這聽起來像你希望你的主線程做一些事情,比如添加新的IMAP客戶端(即生產者),並在運行中刪除當前的客戶端。

至於在那裏你會運行這些東西:你可以在同一臺機器上運行,消費者和生產者在一個可執行文件,在不同的可執行文件,或在不同的機器......一切取決於你的情況。

HTH