在一个简单的Rails 5应用程序的单个控制器中,我有2个动作(live
和test
),都使用ActionController::Live
。 live
经过一个循环,将随机数据写入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关于并发,心跳线程等问题的答案,并且没有运气。
答案 0 :(得分:0)
经过大量挖掘后,结果发现您需要在"\n"
末尾添加新行response.stream.write
才能使它离开缓冲区。