НТН
аюсь создать (пока частное) веб-приложение, которое будет использовать соединения 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 и удалять текущие на лету. Как это может выглядеть? Возможно, что-то с очередью?
Любая помощь и комментарии очень ценятся!