Трансляция подключаемого модуля Grails Atmosphere для разных клиентов

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

Клиент подключается по 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()
        }
    }
}

}


person user1117605    schedule 11.01.2012    source источник


Ответы (1)


Салют.

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

Спасибо

-- Жан-Франсуа

person jfarcand    schedule 13.01.2012