使用 Grails 实现服务器端事件

Implement Server Side Events with Grails

我想用 grails 实现服务器端事件。我想要的是,只有当数据库发生变化时,我的数据表才应该刷新。我想为此使用 HTML5 服务器端事件。我的第一个问题是,在使用 SSE 时,我观察到客户端不断向服务器发出请求,如果数据可用,它就会拉取它。它类似于每 3-4 秒发送一次可以更改的 Ajax 调用,但我真正想要的是,只有当数据库中的数据发生变化时,才应该在数据表中进行刷新。我还想向客户端发送 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);

我知道我距离实现我的意图还有很长的路要走,但我们将不胜感激任何帮助

要回答这个问题,因为这将是一场漫长的对话。就目前而言,解决方案过于宽泛,无法给出正确的答案,因为关于你如何做事的角度可能会在如此巨大的范围内变化,从使用 events 开始,在记录保存时触发,然后继续进行 client socket 通过应用程序连接到 direct socket client connection 在保存点触发要发送给客户端的内容。这些方法可能都更复杂更复杂,总之可以用更简单的方法完成。

  1. 随着用户进入他们的界面,让用户与后端侦听器建立 ws 连接。它可以与 no room/separation 中的位置相同(需要额外的复杂性)。

当他们加入房间时,在您的 websocket listener that collections each session and userId. I wouldn't do it the chat way since this is injected through a service that keeps it as a collection instead like this 顶部声明一个 static concurrent map 并将 RunnableFuture 更改为 Websocket 会话,如服务 link 示例中所示。

一旦你有了这个,你可以简单地调用一个 broadcast something like this 来获取你的静态并发映射,并且对于每个会话,要么在 json 和用户进程中广播整个新列表 html 用它更新或发送一个触发器说更新页面,然后他们开始做 ajax 调用更新列表。

有关如何使用 Grails 3 实现服务器发送事件的教程,请参阅以下指南:

http://guides.grails.org/server-sent-events/guide/index.html