我正在尝试构建一个(目前是私有的)Web 应用程序,该应用程序将利用 IMAP IDLE 连接在人们到达时显示他们的电子邮件。
我很难弄清楚如何将它组合在一起 - 以及它如何与我的 Heroku RoR 服务器配合使用。
我编写了一个用于连接 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 应用程序融合在一起?我不能用最后一个循环阻塞线程 - 那么我该如何运行呢?另一个服务器?一个测功机 - 也许是一个工人?我一直在阅读有关事件机器的一些信息 - 这可以解决我的问题吗,如果可以,我应该如何写这个?
另一件事是,我希望能够添加新的 imap 客户端并即时删除当前的客户端。看起来怎么样?也许有排队的东西?
非常感谢任何帮助和评论!