相关疑难解决方法(0)

ActionController :: LIve是否可以检查连接是否仍然存在?

我正在尝试使用Rails 4的直播流实现文本/事件流.它工作得很好,我遇到的唯一麻烦就是我无法在不发送任何消息的情况下检查连接是否存在.

我想出的唯一解决方案是使用循环刻度生成器创建支持通道,以便某些后台任务将定期发送消息.但它似乎是凌乱和不可靠的.更好的解决方案?

这是我的控制器:

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
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails event-stream publish-subscribe

17
推荐指数
1
解决办法
2640
查看次数

Rails 4,Live Streaming,保持打开状态,阻止请求

我正在尝试使用Rails 4 Live Streaming组件.这一切都有效,除了它似乎流保持打开并阻止新的请求.

关闭或单击应用程序中的新链接时,如何确保连接正常关闭?

这是我的直播活动控制器.

  def events
    response.headers["Content-Type"] = "text/event-stream"
    redis = Redis.new
    redis.psubscribe("participants.*") do |on|
      on.pmessage do |pattern, event, data|
        response.stream.write("event: #{event}\n")
        response.stream.write("data: #{data}\n\n")
      end
    end
  rescue IOError
  ensure
    redis.quit
    response.stream.close
  end
Run Code Online (Sandbox Code Playgroud)

数据库conf

production:
  adapter: postgresql
  encoding: unicode
  database: ************
  pool: 1000
  username: ************
  password: ************
  timeout: 5000
Run Code Online (Sandbox Code Playgroud)

我在使用postgresql 9.2.x的Ubuntu 10.04上使用puma作为独立的webserver(我没有需要由nginx提供的大量静态文件).

ruby-on-rails http-live-streaming puma ruby-on-rails-4

7
推荐指数
2
解决办法
3027
查看次数

使用ActionController进行流式处理:: Live无法在生产中使用

我正在使用Ruby on Rails 4.1,使用ActionController :: Live从Sidekiq进程传输数据.在开发中,我的流媒体工作非常棒.在生产中(使用Nginx/Puma),它并不是很好.这是正在发生的事情.

在制作中,参考我的Firebug下面的图像,"/ events"被多次发射.为什么我EventSource会被反复解雇而不是等待我的数据呢?这在开发中不会发生.

Firebug EventSource

只要我的Sidekiq进程正在运行,它将以随机间隔重复触发.一旦我的sidekiq进程完成,它将挂起并且不再启动.然后最后一个将最终超时(见图中的红色文字)

这是我的coffeescript:

source = new EventSource('/events')
source.addEventListener 'my_event', (e) ->
    console.log 'Got a message!'
    # Add the content to the screen somewhere
Run Code Online (Sandbox Code Playgroud)

参考Firebug图像,它几乎就像我在Sidekiq过程中超时一样.我是从工人那里发帖到redis的.

初始化

REDIS = Redis.new(url: 'redist://localhost:6379')
Run Code Online (Sandbox Code Playgroud)

Sidekiq工人

REDIS.publish('my_event', 'some data')
Run Code Online (Sandbox Code Playgroud)

然后我有连接EventSource的控制器动作:

def events
  response.headers["Content-Type"] = "text/event-stream"
  redis = Redis.new(url: "redist://localhost:6379")
  # blocks the current thread
  redis.subscribe(['my_event', 'heartbeat']) do |on|
    on.message do |event, data|
      if event == 'heartbeat'
        response.stream.write("event: heartbeat\ndata: heartbeat\n\n")
      elsif event == 'my_event'
        response.stream.write("event: #{event}\n") …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails server-sent-events sidekiq puma

5
推荐指数
1
解决办法
1156
查看次数