0

我正在尝试扩展 Groovy Mag Atmosphere Example ( https://github.com/rbramley/GroovyMagJMS ) 以广播到不同的客户端。(就像在 Atmosphere 中向一部分订阅者广播一样)

客户端通过 url http://localhost:8080/GrailsTest/atmosphere/messages/?id=1连接。一个 id 将被传递给服务器。新添加的lookupBroadcaster 方法创建一个带有id 的新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()
        }
    }
}

}

4

1 回答 1

0

这应该基于该代码段工作。onStateChange()广播时是否调用了该方法?由于您正在恢复,第一个广播将起作用,但之后 AtmosphereResource 将从其关联的广播器中删除,因此不再更新。

于 2012-01-13T20:56:32.593 回答