2011-03-08 3 views
3

실시간 푸시 알림을 위해 Juggernaut 2와 함께 레일 앱을 작성 중이며이 문제를 해결하는 방법을 모르겠습니다. 채팅방에 여러 명의 사용자가 있으며 30 초마다 채팅방의 각 브라우저로 푸시를 나가기 위해 타이머를 실행하고 싶습니다. Juggernaut 2는 node.js를 기반으로하므로이 코드를 작성해야한다고 가정합니다. 난 그냥 여기서 당신은에 관심이있을 수 저거넛 2.Juggernaut가 설치된 서버 측 타이머 2

+2

https://github.com/maccman/juggernaut에서 시작 위치를 설명하지 않습니까? –

+0

네, Juggernaut가 일하고 있으며 채팅 앱이 있습니다. node.js에 서버 사이드 타이머를 추가하고 Juggernaut와 통합하려고합니다. – TenJack

답변

1

난 그냥 간단하게 그렇게 에누리 내 대답을 저거넛을 통해 찾아 ...

  1. 를이 통합의 관점에서 시작하는 아무 생각이 없다 Channel 객체 (https://github.com/maccman/juggernaut/blob/master/lib/juggernaut/channel.js) Channel.channel은 존재하는 모든 채널의 객체입니다 (루비의 해시를 생각해보십시오). . 30 초주기 타이머 (setInterval - http://nodejs.org/docs/v0.4.2/api/timers.html#setInterval)를 설정하여 모든 채널에서 작업을 수행 할 수 있습니다.
  2. 각 루프 반복에서 수행 할 작업은 무엇입니까?

    publish: function(message){ 
    var channels = message.getChannels(); 
    delete message.channels; 
    
    for(var i=0, len = channels.length; i < len; i++) { 
        message.channel = channels[i]; 
        var clients  = this.find(channels[i]).clients; 
    
        for(var x=0, len2 = clients.length; x < len2; x++) { 
        clients[x].write(message); 
        } 
        } 
    

    }

그래서 당신은 기본적으로 Channel.channels로하고있는 경우 설정 message.channels와 메시지 객체를 생성해야한다 : 글쎄, 상기 채널 코드에 대한 링크가 게시 방법이있다 해당 메시지를 게시 방법에 전달하면 모든 고객에게 발송됩니다.

메시지의 내용과 관련하여 클라이언트 측 (socket.io - 채팅 클라이언트 인 Juggernaut 및 socket.io에서 이미 빌드 한 사용자)을 사용하고 싶지 않습니다.

간격을 만드는 코드를 넣는 위치와 모든 채널에 메시지를 게시하기 위해 콜백을 시작하는 위치에 대해서는 지정된 포트에서 수신하는 실제 서버를 만드는 코드를 여기에서 확인하십시오. (https : //github.com/maccman/juggernaut/blob/master/lib/juggernaut/server.js) init() 내에 간격을 첨부하면 서버를 시작하자마자 30 초마다 점검하여 모든 채널에 주어진 메시지

+0

아직 모든 것을 파악하려고합니다. 이것은 큰 리드, 감사합니다. – TenJack

+0

TenJack - 무엇이 혼란 스럽습니까? Lemme 알고 도움을 시도 할 수 있습니다. – ambertch

+0

안녕하세요 ambertech, 내가 지금 고심하고있는 주요 것은 내가 모든 채널에 대한 아니라 특정 채널 이름에 대한 타이머를 시작하고 싶습니다.개별 대화방마다 타이머를 시작할 수 있어야합니다. 어떤 도움을 주셔서 감사합니다. – TenJack

1

다음은 Ruby에서 30 초마다 푸시하는 샘플 클라이언트입니다. 다음, 루비와 루비 젬을 설치 우리는 가변 시간 간격에 질문을 밀어 퀴즈 시스템을 구현 gem install juggernaut

#!/usr/bin/env ruby 
require "rubygems" 
require "juggernaut" 
while 1==1 
Juggernaut.publish("channel1","some Message") 
sleep 30 
end 
1

실행

은 레디 스 및 노드와 저거 너트를 설치합니다. 우리의 경우 핵심은 우리가 아직 들어오는 점수를 처리 할 수 ​​있도록 퀴즈 타이밍 백그라운드 프로세스를 실행하는 '스폰'를 사용했다

def start_quiz 
    Rails.logger.info("*** Quiz starting at #{Time.now}") 
    $redis.flushall # Clear all scores from database 

    quiz = Quiz.find(params[:quizz] || 1) 
    @quiz_master = quiz.user 
    quiz_questions = quiz.quiz_questions.order("question_no ASC") 

    spawn_block do 
    quiz_questions.each { |q| 
     Rails.logger.info("*** Publishing question #{q.question_no}.") 
     time_alloc = q.question_time 
     Juggernaut.publish(select_channel("/quiz_stream"), {:q_num => q.num, :q_txt => q.text :time=> time_alloc}) 
     sleep(time_alloc)    
     scoreboard = publish_scoreboard 
     Juggernaut.publish(select_channel("/scoreboard"), {:scoreboard => scoreboard}) 
    } 
    end 

    respond_to do |format| 
    format.all { render :nothing => true, :status => 200 } 
    end 
end 

다음과 같이 우리는 그것을했다.

나는 이것이 얼마나 확장 성이 있는지 알지 못합니다.