Redis订阅+ Rails ActionController :: Live挂起

时间:2019-06-16 13:34:06

标签: ruby-on-rails redis publish-subscribe

在一个简单的Rails 5应用程序的单个控制器中,我有2个动作(livetest),都使用ActionController::Livelive经过一个循环,将随机数据写入response.stream.write,没有任何问题。可以。

但是,在test中,我正在使用Redis.subscribe。这是动作代码:

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

            redis = Redis.new

                redis.subscribe_with_timeout(30, "abc") do |on|
                    on.message do |event, data|
                        puts data
                        response.stream.write data
                    end
                end
        rescue IOError
            # ignore
        ensure
            redis.quit
            response.stream.close
        end

然而,test方法无法正常工作。这就是发生的情况:

我启动应用程序,并用test击中curl端点。卷毛停止按预期等待数据。 然后,在redis-cli中,我向abc频道发送一条消息。我立即在Rails应用程序窗口(puts data)中看到我的消息,并且在curl中看到了这个消息:

HTTP/1.1 200 OK
Content-Type: text/event-stream
Cache-Control: no-cache
X-Request-Id: 25df052d-e3f2-4327-9a97-088e702460fa
X-Runtime: 2.709001
Transfer-Encoding: chunked

尽管来自redis-cli的所有后续消息都打印在导轨的一侧,但直到超时(subscribe_with_timeout中的30秒)之后,它们才被卷发接收。

我正在运行Puma,已经查看并实现了所有Stackoverflow关于并发,心跳线程等问题的答案,并且没有运气。

1 个答案:

答案 0 :(得分:0)

经过大量挖掘后,结果发现您需要在"\n"末尾添加新行response.stream.write才能使它离开缓冲区。