使用Juggernaut 2的服务器端计时器

3

我正在使用Juggernaut 2为实时推送通知编写一个rails应用程序,但不确定如何解决这个问题。我有许多用户在聊天室中,并希望运行一个定时器,以便每30秒将推送发送到聊天室中的每个浏览器。Juggernaut 2是基于node.js构建的,因此我认为需要在那里编写此代码。但是我不知道从哪里开始将其与Juggernaut 2集成。


2
https://github.com/maccman/juggernaut有没有解释从哪里开始? - Dmytrii Nagirniak
是的,Juggernaut正在工作,我有一个聊天应用程序,我正在尝试在node.js中添加一个服务器端计时器,并将其与Juggernaut集成。 - TenJack
3个回答

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方法:

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

    }

所以你基本上需要创建一个消息对象,将message.channels设置为Channel.channels,如果你将该消息传递给publish方法,它将发送到所有客户端。

至于你的消息内容,我不知道你在客户端使用什么(socket.io?已经为你构建了Juggernaut和socket.io的聊天客户端?),所以这取决于你。

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


仍在努力弄清楚这一切。这是一个很好的线索,非常感谢。 - TenJack
TenJack - 有什么不清楚的吗?告诉我,我可以尝试帮助你。 - ambertch
嗨,ambertech,我现在遇到的主要问题是,我想为特定的频道名称启动一个计时器,而不是所有频道。我需要能够为每个单独的聊天室启动计时器。感谢任何帮助。 - TenJack

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

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”来运行一个后台进程来进行测验计时,以便我们仍然可以处理传入的分数。
我不知道这有多可扩展。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接