我想用grails实现服务器端事件。我想要的是,只有当DataBase发生变化时,我的DataTable才会刷新。我想为此用户使用HTML5 Server Side事件。我的第一个问题是,在使用SSE时,我观察到客户端不断向服务器发出请求,如果数据可用,则将其拉出。它类似于每3-4秒发送一次Ajax调用,可以更改,但我真正想要的只是当数据库中的数据发生更改时,DataTable中应该刷新。此外,我想将JSON数据发送到客户端,但无法以正确的格式发送它。下面是我的控制器代码。
def test(){
def action
something.each(){
action = "<a href=\"javascript:fetchDetails('"+it.id+"','comments'"+")\" class='btn btn-primary'><span class='glyphicon glyphicon-upload'></span></a>"
dataArr << [
it.Number,
it.product,
it.description,
OrgChart.findByid(it.Owner)?.displayName,
OrgChart.findByid(it.Coordinator)?.displayName,
startDate,
endDate,
it.status.status,
action
]
}
println dataArr
response.setContentType("text/event-stream;charset=UTF-8")
response << "data: ${dataArr}\n\n"
render "Hi"
}
}
以下是gsp或客户端代码
console.log("Starting eventSource");
var eventSource = new EventSource("/ops/test");
console.log("Started eventSource");
eventSource.onmessage = function(event) {
var data = JSON.stringify(event.data)
console.log("Message received: " + JSON.parse(data));
changeRequestsTable.clear().rows.add(JSON.parse(event.data)).draw()
};
eventSource.onopen = function(event) { console.log("Open " + event); };
eventSource.onerror = function(event) { console.log("Error " + event); };
console.log("eventState: " + eventSource.readyState);
// Stop trying after 10 seconds of errors
setTimeout(function() {eventSource.close();}, 10000);
我知道我距离实现我想要的目标还有很长的路要走,但任何帮助都会非常感激
答案 0 :(得分:1)
要回答这个问题,因为这是一个很长的对话。因为它的解决方案太广泛而无法给出正确的答案,因为关于你如何做事的角度可能会在如此大的范围内变化,而不是使用events
在记录时触发,然后转到任何一个{ {1}}通过应用程序连接到client socket
的保存点会触发向客户端发送的内容。这些方法可能更复杂,更纠结,简而言之,可以更简单的方式完成。
当他们加入会议室时,在您的websocket listener that collections each session and userId的顶部声明direct socket client connection
。我不会这样做的聊天方式,因为这是通过一个服务注入,而不是将其作为集合而是like this,并将RunnableFuture更改为Websocket会话,如服务链接示例中所示。
一旦你有了这个,你可以简单地调用一个broadcast something like this来获取你的静态并发映射,并且每个会话要么在json中广播整个新列表,要么用户进程html update,或者发送一个触发器来说明更新页面,他们去做ajax调用更新列表。
答案 1 :(得分:0)
有关如何使用Grails 3实现服务器已发送事件的教程,请参阅以下指南:
http://guides.grails.org/server-sent-events/guide/index.html