• Grails 中使用 grailseventspush 实现 ajax/comet/websocket 消息推送


    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>
    

    grails.Events中接受的transport参数,是atmosphere所支持的,基本上包含了各种ajax/comet/websocket协议。

    具体支持 polling, long-polling, streaming, jsonp, sse, websocket

    整个处理流程,println输出的结果:

    1、msgToServer Filter >> MyEvents.groovy msgToServer标签的filter过滤器
    2、msg from browser msg:[msg: msg from browser] >> MyService.groovy msgToServer方法
    3、service send 'msgFromServer' msg >> MyService.groovy msgToServer方法
    4、browserFilter after Service >> MyEvents.groovy msgToServer标签的browserFilter过滤器
    5、browserFilter data: [msg:!this is msg!] >> MyEvents.groovy msgToServer标签的browserFilter过滤器

    参考:

    服务器反响推送技术 ajax/comet等,ibm的系列文章 http://www.ibm.com/developerworks/cn/views/web/libraryview.jsp?viewby=search&sortby=Date&sortorder=desc&viewby=Search&search_by=%E5%8F%8D%E5%90%91+Ajax+%E9%83%A8%E5%88%86&dwsearch.x=14&dwsearch.y=15
    Using Browser Push in Grails http://java.dzone.com/articles/using-browser-push-grails
    grails-atmosphere-plugin框架 https://bitbucket.org/bgoetzmann/grails-atmosphere-plugin/wiki/Home
    jQuery.atmosphere.js API https://github.com/Atmosphere/atmosphere/wiki/jQuery.atmosphere.js-API
    grails-events-push https://github.com/smaldini/grails-events-push
    Grails Plugin Platform http://grailsrocks.github.com/grails-platform-core/guide/

    ps: 读goovy语言的源码太痛苦了,文档少是其一,又揉和了太多语言的特性。。。。。。

     
     
    分类: Grails
  • 相关阅读:
    YCSB测试Mysql,MongoDB,TokuMX,Couchbase性能
    使用FIO对SATA、SSD和PCIe Flash进行测试
    使用jenkins实现持续集成
    linux服务器性能(网卡流量、CPU、内存、磁盘使用率)监控
    Linux下Hadoop2.7.1集群环境的搭建(超详细版)
    10分钟学会js处理json常用方法
    springboot:Java模板引擎Thymeleaf介绍
    springboot使用遇到问题:Class “model.Address” is listed in the persistence.xml file but not mapped
    eclipse4.6.1安装SpringSource Tool Suite(sts-eclipse)插件
    由一条sql语句想到的子查询优化
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2878947.html
Copyright © 2020-2023  润新知