1

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

服务:

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

4 回答 4

0

When you define your events in grails, you can filter out cients by using a browserFilter closure.

于 2013-05-16T18:34:04.783 回答
0

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

于 2013-09-22T16:53:09.783 回答
0

我认为您可以使用会话来共享 onRequest 的事件。

request.session[userId]=event

然后在控制器中:

broadcast(jsonResult,session[userId])
于 2011-09-09T08:13:58.163 回答
0

你可以通过会话

session.broadcaster.broadcast(jsonResult, AtmosphereResource)

请参阅此API

(我是大气的创造者)。

于 2013-09-27T16:47:17.737 回答