首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ActionController::Live是否可以检查连接是否仍处于活动状态?

ActionController::Live是否可以检查连接是否仍处于活动状态?
EN

Stack Overflow用户
提问于 2013-01-11 06:47:18
回答 1查看 2.8K关注 0票数 17

我正在尝试使用Rails4的Live streaming实现文本/事件流。它工作得很好,我遇到的唯一问题是,如果不发送任何消息,我就无法检查连接是否处于活动状态。

我想出的唯一解决方案是使用循环计时生成器建立支持通道,这样一些后台任务就会定期发送消息到那里。但它似乎是混乱和不可靠的。有更好的解决方案吗?

这是我的控制器:

代码语言:javascript
复制
require 'persistency/sse'
require 'persistency/track'

class PersistencyController < ApplicationController
  include ActionController::Live

  def stream
    response.headers['Content-Type'] = 'text/event-stream'

    sse = Persistency::SSE.new(response.stream)
    track = Persistency::Track.new(current_user)
    redis = Redis.new

    begin
      redis.subscribe(:info, :chat) do |on|
        on.message do |channel, message|
          sse.write({ :message => message }, :event => channel)
        end
      end
    rescue IOError
    ensure
      track.close
      sse.close
    end
  end
end
EN

回答 1

Stack Overflow用户

发布于 2013-01-12 08:35:03

好的,我找到了两个选择:

1)有趣但不好(因为我不知道我应该使用哪个服务器来处理1000个并行连接):

代码语言:javascript
复制
begin
  ticker = Thread.new { loop { sse.write 0; sleep 5 } }
  sender = Thread.new do
    redis.subscribe(:info, :chat) do |on|
      on.message do |event, message|
        sse.write(message, :event => event.to_s)
      end
    end
  end
  ticker.join
  sender.join
rescue IOError
ensure
  Thread.kill(ticker) if ticker
  Thread.kill(sender) if sender
  track.close
  sse.close
end

2)太棒了。使用Goliath服务器。事实证明,它可以在没有任何自动报价器的情况下检查连接是否丢失。在去Goliath的路上发现了Cramp它是轻量级的,希望速度快,但似乎被抛弃了。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14268690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档