首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Redis订阅+ Rails ActionController::Live挂起

Redis订阅+ Rails ActionController::Live挂起
EN

Stack Overflow用户
提问于 2019-06-16 21:34:06
回答 1查看 62关注 0票数 0

在一个简单的Rails5应用程序的单个控制器中,我有两个操作(livetest),都使用ActionController::Livelive经历了一个循环,并将随机数据写入response.stream.write,没有任何问题。它起作用了。

然而,在test中,我使用的是Redis.subscribe。下面是操作代码:

代码语言:javascript
复制
        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方法并不像预期的那样工作。这就是发生的事情:

我启动应用程序并使用curl访问test端点。Curl会像预期的那样停止等待数据。然后在redis-cli中,我向abc通道发送一条消息。我立即在rails应用程序窗口(puts data)中看到了我的消息,并且我在curl中看到了以下内容:

代码语言:javascript
复制
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的所有后续消息都打印在rails端,但curl直到超时时间(在subscribe_with_timeout中为30秒)才会接收到这些消息。

我正在运行Puma,我已经查看并实现了所有关于并发、心跳线程和更多的Stackoverflow答案,但没有运气。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-17 05:06:02

在深入研究之后,您发现需要在输出到response.stream.write的任何内容的末尾添加一个新的"\n"行,才能使其从缓冲区中取出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56619324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档