Atmosphere Grails单用户广播

时间:2011-07-29 12:31:53

标签: grails grails-plugin atmosphere

我正在创建一个Grails应用程序,该应用程序利用Atmosphere插件将数据推送到浏览器。但是我在为单个用户(会话的用户)创建广播频道时遇到了麻烦。我的代码如下:

服务:

static atmosphere = [mapping: '/atmosphere/recommend']

def onRequest = { event ->
    def request = event.request
    def response = event.response

    event.suspend()     

    def broadcaster = event.broadcaster
    request.session.broadcaster = broadcaster
    broadcaster.broadcasterConfig.addFilter(new XSSHtmlFilter())     
}

def onStateChange = { event ->

    if (!event.message) return

    event.resource.response.writer.with {
        write "<script>parent.callback('${event.message}');</script>"
        flush()
    }
}

控制器:

def builder = new JSONBuilder()
    def jsonResult = builder.build{
                            artist = artistInstance
                            location = {
                                lat = eventInstance.location.lat
                                lng = eventInstance.location.lng
                            }
                        }

session.broadcaster.broadcast(jsonResult)

此解决方案将jsonResult广播给每个用户。我想要实现的是仅为当前用户广播。 有任何想法吗? 如果您需要更多详细信息,请告诉我们。

由于

4 个答案:

答案 0 :(得分:0)

我认为你可以使用session来分享onRequest的事件。

request.session[userId]=event

然后在控制器中:

broadcast(jsonResult,session[userId])

答案 1 :(得分:0)

在grails中定义事件时,可以使用browserFilter闭包过滤掉客户端。

答案 2 :(得分:0)

嘿,您可以使用分配给每个大气资源的uuid。 要根据大气要求检索暂停的uuid,您可以执行以下操作:
String suspendedUUID = (String)req.getAttribute(ApplicationConfig.SUSPENDED_ATMOSPHERE_RESOURCE_UUID);

答案 3 :(得分:0)

你可以通过会议

session.broadcaster.broadcast(jsonResult,AtmosphereResource)。请参阅此API

- Jeanfrancois(Atmosphere的创作者)