我正在尝试构建一个(目前是私有的)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 应用程序融合在一起?我不能用最后一个循环阻塞线程 - 那么我该如何运行它呢?另一个服务器?一个dyno more - 也许是一个工人?我一直在阅读一些有关事件机器的内容 - 这可以解决我的问题吗?如果可以,我应该如何写这个?
另一件事是,我希望能够添加新的 imap 客户端并动态删除当前的客户端。看起来怎么样?也许需要排队?
非常感谢任何帮助和评论!