我正在尝试使用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) 我正在尝试使用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 4.1,使用ActionController :: Live从Sidekiq进程传输数据.在开发中,我的流媒体工作非常棒.在生产中(使用Nginx/Puma),它并不是很好.这是正在发生的事情.
在制作中,参考我的Firebug下面的图像,"/ events"被多次发射.为什么我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)