Grails 中使用 grails-events-push 实现 ajax/comet/websocket 消息推送
> 浏览器端的推送技术已经很成熟了,这里使用grails events push插件实现。 > > events push基于 http://grailsrocks.github.com/grails-platform-core/guide/ 与 https://github.com/Atmosphere/atmosphere 的插件,也算是 grails-platform-core 的一个扩展。 > 这里使用events push的示例并对它进行一些补遗。
首先创建一个grails项目。
安装插件 events-push ,这里使用 1.0.M7版本
修改 BuildConfig.grooy
在 repositories 中加入atmosphere-runtime的mvn仓库
repositories {
...
mavenRepo "http://mvn.atns.de/repository/internal/"
...
}
在 plugins 中加入
plugins {
...
complie "'org.atmosphere:atmosphere-runtime:1.1.0-SNAPSHOT'"
compile ":events-push:1.0.M7"
...
}
events-push.1.0.M7引用的是atmosphere-runtime:1.1.0-SNAPSHOT。
在 config 目录新建 MyEvents.groovy
events = {
//浏览器要接受名为"msgFromServer"这个通知
'msgFromServer' namespace: 'browser', browser:true, browserFilter: { data, request ->
println "browserFilter after Service"
println " browserFilter data: $data"
return false
}
//浏览器发送这个名为msgToServer的通知
'msgToServer' namespace: 'browser', browser:true, filter: { println "msgToServer Filter"; return true}
}
上面代码中
'msgToServer' 消息的标签,消息名
namespace 消息的分组,组名
browser 是否允许浏览器接受这个消息,grails-platform-core 插件主要用于服务器中事件的推送,events push将它与atmosphere集成了起来,所以就有了这个参数
filter 访问过滤器闭包,相当与config中xxfilters.groovy,通常做一些权限检查什么的。使用atmosphere后,ajax/comet的访问不会经过xxxfilters.groovy,需要在这里做判断,当然同filters一样写好闭包就行了,返回值决定是否拦截浏览器过来的消息给服务器。
browserFilter 在service处理玩浏览器推送的消息后,紧接着会执行这里,他接受两个参数,data:service中event()方法发送的消息内容,request:servlet request。同filters一样,返回值决定是否拦截服务器的消息给浏览器
创建一个Service 名为MyService.groovy
//Listener注解指明这个方法接受那种消息,namespace不填的话接受所有消息,这里接受名为browser分组的消息
//注意,方法名必须是MyEvents.groovy中定义的标签名
@Listener(namespace='browser') def msgToServer(Map data) {
println "msg from browser msg:$data"
println "service send 'msgFromServer' msg"
//发送"msgFromServer"事件
event('msgFromServer', [msg: "!this is msg!"], [namespace: 'browser'])
}
自己更改某个gsp,添加event push的监听器与消息发送器
html:
<r:require module="grailsEvents">
<r:script>
//这里使用sse协议
var grailsEvents = new grails.Events('${createLink(uri: '')}', {transport: 'sse'});
//发送消息给服务器
grailsEvents.send('msgToServer', {msg: "msg from browser"}); //will send data to server topic 'saveTodo'
//接受服务器发送的消息
grailsEvents.on('msgFromServer', function(data){
alert(data);
});
</r:script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述