实时推送消息。html
尽可能不要和 Streaming 搅在一块儿!有相似之处,但仍是请把它们区分开,以便理解!html5
SSE 全称 Server Sent Eventweb
提供方法:ruby
close write
使用举例:cookie
rubyclass MyController < ActionController::Base # 步骤 1 include ActionController::Live def index # 步骤 2 response.headers['Content-Type'] = 'text/event-stream' # 步骤 3 封装了 response.stream sse = SSE.new(response.stream, retry: 300, event: "event-name") # 步骤 4 sse.write({ name: 'John'}) sse.write({ name: 'John'}, id: 10) sse.write({ name: 'John'}, id: 10, event: "other-event") sse.write({ name: 'John'}, id: 10, event: "other-event", retry: 500) ensure # 步骤 5 sse.close end end
通常使用都不明确指定 SSE,而是使用默认的 Buffer,举例:session
rubyclass MyController < ActionController::Base # 步骤 1 include ActionController::Live def stream # 步骤 2 response.headers['Content-Type'] = 'text/event-stream' 100.times { # 步骤 3 直接使用 response.stream response.stream.write "hello world\n" sleep 1 } ensure # 步骤 4 response.stream.close end end
建议 web server 使用 gem 'puma',开发环境下默认使用的 WEBrick 不支持。Unicorn(响应比较快,而且对超时比较严格)、Rainbows! 或 Thin 也能够。ide
process set_response! response_body= log_error
process
常见的同名方法,这里主要是另开一线程进行处理请求。线程
set_response!
也是常见的同名方法,这里主要是设置 response 为 Live::Response 的实例对象。code
response_body=
主要是用于确保 response 用完后关闭。server
log_error
记录错误(有的话)。
Live 可用于构建实时聊天之类等。
content_for
根据状况,有的要改成 provide
若是模板里有更改 Headers, cookies, session and flash 的值,将不起做用
部分 middleware 将不能再使用,如:Rack::Bug、Rack::Cache
异常报告和 Web server 的支持
参考