我正在嘗試構建一個(私人的,現在的)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客戶端,並刪除當前值。那看起來怎麼樣?可能有隊列嗎?
任何幫助和意見非常感謝!
絕對看看EventMachine。你可能還需要從heroku畢業。 – 2011-04-14 02:24:40