Я пытаюсь создать (пока частное) веб-приложение, которое будет использовать соединения 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
Это будет работать, но не без цикла в нижней части, чтобы позволить потокам работать?
Мой вопрос: как мне лучше плавить это вместес моим приложением Ruby On Rails на Heroku?Я не могу блокировать поток с помощью последнего цикла - так как мне это запустить?Другой сервер?Дина более - возможно, рабочий?Я немного читал о Event Machine - может ли это решить мою проблему, если да, то как мне написать это?
Другое дело, что я хотел бы иметь возможность добавлять новые клиенты imapи удалить текущие на лету.Как это может выглядеть?Возможно, что-то с очередью?
Любая помощь и комментарии очень ценятся!