1

我正在尝试构建一个(目前是私有的)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 客户端并即时删除当前的客户端。看起来怎么样?也许有排队的东西?

非常感谢任何帮助和评论!

4

1 回答 1

0

我不熟悉 RoR、Event Machine 等的细节——但您似乎想要设置一个生产者/消费者。

生产者是您的线程,它正在侦听来自 IMAP 服务器的更改。当它得到更改时,它会将它们写入队列。您似乎想要设置多个生产者,每个 IMAP 连接一个。

您的消费者是一个阻塞从队列中读取的线程。当某物进入队列时,它会解除阻塞并处理该事件。

然后,您的主线程将可以自由地做任何您想做的事情。听起来你希望你的主线程做一些事情,比如添加新的 IMAP 客户端(即生产者)和即时删除当前的客户端。

至于你在哪里运行这些东西:你可以在一个可执行文件中运行消费者和生产者,在同一台机器上的不同可执行文件中,或者在不同的机器上......这一切都取决于你的情况。

高温高压

于 2012-03-03T21:44:11.253 回答