【问题标题】:Rails 4 live stream + subscription based updatesRails 4 直播 + 基于订阅的更新
【发布时间】:2013-07-07 13:37:35
【问题描述】:

我有几个关于使用 ActionController::Live 和向用户发送流通知的问题。

  1. 有没有办法判断流是否/何时关闭或不再可写?
  2. 是否有理由在您的操作中手动关闭流?我看过一些他们会明确关闭流的示例,但是看着浏览器,它似乎为我处理了这些?

我有一个我的操作可以订阅的用户通知类。在我的用户控制器的创建操作中,我告诉通知类广播新用户。

为了方便起见,我不得不让信息流保持打开状态。我也不知道何时取消订阅用户通知,因为我不知道流何时关闭(通过浏览器启动它)。

#EventsController
def users
    response.headers['Content-Type'] = 'text/event-stream'
    sse = SSE.new(response.stream)
    sse.write({}, event: :init)
    UserNotifier.sub { |user| sse.write({ name: user.name, id: user.id }, event: :new_user ) }
  end

所以这只是保持一个持久连接打开,然后一旦有东西触发了 UserNotifier 上的广播消息,任何订阅它的人都会触发它的块。

唯一的问题是,我不知道何时取消订阅,在我的代码块中,您看到我只是显式调用 sse.write(包装响应流),而后者又在不知道其状态的情况下盲目调用 stream.write .

更新

我注意到有些人将 IOError 异常作为判断客户端何时断开连接的一种方式。这真的是最好的方法吗?

rescue IOError
    UserNotifier.unsub(...)

...

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 live-streaming


    【解决方案1】:

    您可以使用ensure 确保在写入失败或连接已关闭或出现问题时关闭您的流:

    def your_action
      response.headers['Content-Type'] = 'text/event-stream'
    
      begin
        # Do your writing here: response.stream.write("data: ...\n\n")
      rescue IOError
        # When the client disconnects, writing will fail, throwing an IOError
      ensure
        response.stream.close
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多