好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Grails 中使用 grailseventspush 实现 ajax/comet/websocke

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 -&gt;
         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?view by=search&sort by=Date&sort order=desc&view by=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

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于Grails 中使用 grailseventspush 实现 ajax/comet/websocke的详细内容...

  阅读:40次