Плагин Grails Atmosphere для разных клиентов - PullRequest
0 голосов
/ 12 января 2012

Я пытаюсь расширить Пример Groovy Mag Atmosphere (https://github.com/rbramley/GroovyMagJMS) для вещания на разных клиентов. (Как в Вещание на подмножество подписчиков в Атмосфере )

Клиент подключается с помощью URL http://localhost:8080/GrailsTest/atmosphere/messages/?id=1. Идентификатор будет передан на сервер. Новый добавленный метод lookupBroadcaster создает новый объект Broadcaster с идентификатором. Когда я хочу передать сообщение, клиент не получает результат.

Может кто-нибудь помочь мне и, может быть, попробовать?

Я добавил библиотеку атмосферой 0.8.2 в BuildConfig.groovy, чтобы использовать сопоставления типа '/atmosphere/messages/*'.

dependencies {  
    runtime 'org.atmosphere:atmosphere-runtime:0.8.2'
}


class AtmosphereService {

static transactional = false

static atmosphere = [mapping: '/atmosphere/messages/*']

static exposes = ['jms']

@Subscriber(topic='msgevent')
def onEvent(msg) {
    println 'onevent'
    def payload = msg
    if(msg instanceof Map) {
        // convert map messages to JSON
        payload = msg.encodeAsJSON()
    }

    Broadcaster b = lookupBroadcaster(msg["id"], false);
    b.broadcast(payload)

    return null
}

Broadcaster lookupBroadcaster(String id, Boolean createBroadcast) {
    return BroadcasterFactory.getDefault().lookup(id, createBroadcast)
}

def onRequest = { event ->

    def req = event.request
    def id = req.getParameter("id")

    Broadcaster b = lookupBroadcaster(id, true);
    event.setBroadcaster(b);
    b.addAtmosphereResource(event)

    event.suspend()

}

def onStateChange = { event ->
    if (event.message) {
        log.info "onStateChange, message: ${event.message}"

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

}

1 Ответ

0 голосов
/ 14 января 2012

Salut.

Это должно работать на основе этого фрагмента кода. Метод onStateChange () вызывается при трансляции? Поскольку вы возобновляете, первая трансляция будет работать, но после этого AtmosphereResource будет удален из связанного с ним вещателя, поэтому обновление больше не будет.

Спасибо

- Жанфрансуа

...