服务器端计时器与Juggernaut 2

时间:2011-03-08 02:20:33

标签: ruby-on-rails node.js juggernaut

我正在用Juggernaut 2编写一个rails应用程序用于实时推送通知,我不知道如何解决这个问题。我在聊天室中有很多用户,我想运行一个计时器,以便每隔30秒就可以在聊天室中的每个浏览器中进行推送。 Juggernaut 2是基于node.js构建的,所以我假设我需要在那里编写这段代码。我只是不知道从与Juggernaut 2的整合方面开始。

3 个答案:

答案 0 :(得分:1)

我只是简单地浏览了一下Juggernaut,所以我的答案就像一粒盐......

  1. 您可能对Channel对象感兴趣(https://github.com/maccman/juggernaut/blob/master/lib/juggernaut/channel.js)您会注意到Channel.channel是一个对象(想想ruby的哈希)存在的所有通道。您可以设置30秒重复计时器(setInterval - http://nodejs.org/docs/v0.4.2/api/timers.html#setInterval)以对您的所有频道执行某些操作。
  2. 在每次循环迭代中做什么?那么,前面提到的Channel代码的链接有一个发布方法:

    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);
        }
      }  
    

    }

  3. 因此,您基本上必须创建一个Message对象,其message.channels设置为Channel.channels,如果您将该消息传递给publish方法,它将发送给您的所有客户端。

    关于你的消息的内容,我不知道你在使用客户端(socket.io?一个人已经为你在Juggernaut和socket.io上为你建造的聊天客户端),所以这取决于你。

    至于在何处放置创建间隔的代码并触发回调以将消息发布到所有通道,您可能需要在创建实际服务器侦听给定端口的代码中进行检查:(https:/ /github.com/maccman/juggernaut/blob/master/lib/juggernaut/server.js)如果在init()中附加时间间隔,那么一旦启动服务器,它将每隔30秒检查一次,以发布给定的时间消息到每个频道

答案 1 :(得分:1)

这是一个示例客户端,它在Ruby中每30秒推送一次。

使用Redis和Node安装你的Juggernaut:安装ruby和rubygems,然后运行gem install juggernaut

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

答案 2 :(得分: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

我们案例中的关键是使用'spawn'为测验时间运行后台进程,以便我们仍然可以处理传入的分数。

我不知道这是多么可扩展。