> 瀏覽器端的推送技術已經很成熟了,這裡使用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:
### 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語言的源碼太痛苦了,文檔少是其一,又揉和了太多語言的特性。。。。。。