2011-04-09 4 views
1

저는 사람들이 도착할 때 IMAP IDLE 연결을 활용하여 사람들의 이메일을 보여줄 (지금은 사적인) 웹 응용 프로그램을 만들려고합니다.Ruby IMAP IDLE 동시성 - 다루는 방법?

나는 이것을 함께 해킹하는 방법을 알아내는 데 어려움을 겪고 있으며, 이것이 Heroku RoR 서버와 어떻게 잘 어울리는지를 알아내는 데 어려움을 겪고 있습니다.

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 서버에 연결하고 공회전에 대한 기본 스크립트를 작성했습니다

,이 같은 (간체)를 보인다. 보시다시피, 이것은 루프로 막고 있습니다.

내 사용자를 위해 동시에 여러 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 응용 프로그램과 함께 녹일 수 있습니까? 마지막 루프가있는 스레드를 차단할 수 없습니다. 어떻게 실행합니까? 다른 서버? dyno 더 - 아마 노동자? Event Machine에 대해 조금 읽었습니다. 문제가 해결 될 수 있습니까? 그렇다면 어떻게 작성해야합니까?

또 다른 것은 새로운 인스턴트 메시징 클라이언트를 추가하고 현재 인스턴트 메시징 클라이언트를 제거 할 수 있기를 바랍니다. 어떻게 보이나요? 아마도 대기열이있는 것 같습니까?

도움이나 의견을 보내 주시면 대단히 감사하겠습니다.

+1

확실히 EventMachine을 살펴보십시오. 당신은 또한 영웅을 졸업해야 할 수도 있습니다. –

답변

0

저는 RoR, Event Machine 등의 세부 사항에 익숙하지 않지만 제작자/소비자를 설정하려는 것 같습니다.

생산자는 IMAP 서버의 변경 사항을 수신하는 스레드입니다. 변경 사항을 가져 오면 대기열에 씁니다. IMAP 연결마다 하나씩 여러 개의 제작자를 설정하려는 것 같습니다.

소비자는 대기열에서 읽음으로 인해 차단되는 스레드입니다. 어떤 것이 큐에 들어가면 이벤트를 차단 해제하고 처리합니다.

주 스레드는 원하는대로 자유롭게 할 수 있습니다. 새 IMAP 클라이언트 (즉, 제작자)를 추가하고 현재의 IMAP 클라이언트를 즉시 제거하는 것과 같은 일을하는 기본 스레드를 원한다고 들립니다.

다음과 같은 것들을 실행할 수 있습니다. 사용자 및 생산자를 하나의 실행 파일, 동일한 컴퓨터의 별도 실행 파일 또는 다른 컴퓨터에서 모두 상황에 따라 실행할 수 있습니다.

HTH