使用Grails实现服务器端事件

时间:2016-12-12 15:10:08

标签: javascript html5 grails groovy server-sent-events

我想用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);

我知道我距离实现我想要的目标还有很长的路要走,但任何帮助都会非常感激

2 个答案:

答案 0 :(得分:1)

要回答这个问题,因为这是一个很长的对话。因为它的解决方案太广泛而无法给出正确的答案,因为关于你如何做事的角度可能会在如此大的范围内变化,而不是使用events在记录时触发,然后转到任何一个{ {1}}通过应用程序连接到client socket的保存点会触发向客户端发送的内容。这些方法可能更复杂,更纠结,简而言之,可以更简单的方式完成。

  1. 当用户进入他们的界面时,让用户与后端监听器建立ws连接。它可以与没有房间/分离的位置相同(需要额外的复杂性)。
  2. 当他们加入会议室时,在您的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