【发布时间】:2016-09-18 23:14:42
【问题描述】:
我正在尝试在 grails v2.4 上实现 SSE,但我无法阻止 grails 关闭连接。 我所拥有的是:
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA
class SseController {
def heartbeat = {
response.contentType = 'text/event-stream'
response.characterEncoding = 'UTF-8'
response.setHeader('Cache-Control', 'no-cache')
response.setHeader('Connection', 'keep-alive')
response << 'data: 12345\n\n'
response.flushBuffer()
def grails_request = request.getAttribute(GA.WEB_REQUEST)
grails_request.setRenderView(false)
}
}
但如果我这样做,客户端浏览器在订阅频道后会报告以下内容:
Open [object Event]
Data:12345
Error [object Event]
我得到的错误是由于在控制器中完成“心跳”操作后连接关闭。 如果我添加一个while循环来保持动作像这样运行......
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA
class SseController {
def heartbeat = {
response.contentType = 'text/event-stream'
response.characterEncoding = 'UTF-8'
response.setHeader('Cache-Control', 'no-cache')
response.setHeader('Connection', 'keep-alive')
response << 'data: 12345\n\n'
response.flushBuffer()
def grails_request = request.getAttribute(GA.WEB_REQUEST)
grails_request.setRenderView(false)
while(true) {
sleep(10000)
}
}
}
... 那么客户端浏览器永远不会收到数据。
response.flushBuffer() 命令没有任何作用。
连接没有关闭,没关系,但是数据不会发送到客户端。
因此,正确的解决方案是摆脱 while 循环,同时告诉 Grails 在执行操作后不要关闭连接。
有人知道怎么做吗? 顺便说一句,我尝试同时使用 Tomcat 和 Jetty 服务器,结果都一样;控制器动作完成后,所有消息都会立即发送。
【问题讨论】: