氛围:托管服务的多个客户端

时间:2014-05-05 18:24:10

标签: java javascript angularjs jetty atmosphere

我们正在尝试添加Amosphere支持的嵌入式Jetty 9应用程序。目标是为基于AngularJS的Web应用程序提供实时数据。我们正在使用Atmosphere 2.1.3(尽管我们也尝试过2.2.0-SNAPSHOT)。

现在的问题是,虽然应用程序与一个客户端完美配合,但它会因多个客户端而失败:第一个客户端停止,新客户端接管。

以下是在服务器中初始化Atmosphere的代码(实例化并启动Jetty的类):

    ServletHolder atmosphereServletHolder = new ServletHolder(AtmosphereServlet.class);
    atmosphereServletHolder.setAsyncSupported(true);
    serviceContext.addServlet(atmosphereServletHolder, "/atmosphere/*");        

以下是托管服务代码(基于聊天示例):

注解:

@ManagedService(path = "/atmosphere/values")
@Singleton

代码:

private static final Logger LOGGER = LoggerFactory.getLogger(MyService.class);

@Ready(value = Ready.DELIVER_TO.ALL)
public final void onReady(final AtmosphereResource atmosphereResource){
    LOGGER.info("Browser {} connected.", atmosphereResource.uuid());
}

@Disconnect
public final void onDisconnect(final AtmosphereResourceEvent atmosphereResourceEvent){
    final String uuid = atmosphereResourceEvent.getResource().uuid();
    if(atmosphereResourceEvent.isCancelled()) {
        LOGGER.info("Browser {} unexpectedly disconnected", uuid);
    } else if(atmosphereResourceEvent.isClosedByClient()) {
        LOGGER.info("Browser {} closed the connection", uuid);
    }
}

@Message(encoders = {MessageEncoderDecoder.class})
public ListResponse list(Object test) {
    ...

    return new ListResponse(...);
}

这是大多数客户端(同样,主要基于角度示例)。推送到套接字的数据没有意义,因为服务没有参数:

    $scope.model = {
        transport: 'websocket',
        accounts: {}
    };

    var request = {
        url: '/atmosphere/values',
        contentType: 'application/json',
        logLevel: 'debug',
        transport: 'websocket',
        trackMessageLength: true,
        reconnectInterval: 5000,
        enableXDR: true,
        timeout: 600000
    };

    request.onOpen = function (response) {
        $scope.model.transport = response.transport;
        $scope.model.uuid = response.request.uuid;
        $scope.model.connected = true;
        $scope.model.content = 'Atmosphere connected using ' + response.transport;
        socket.push(angular.toJson({ test: 'test' }));
    };

    var socket = null;
    request.onClientTimeout = function (response) {
        $scope.model.content = 'Client closed the connection after a timeout. Reconnecting in ' + request.reconnectInterval;
        $scope.model.connected = false;
        setTimeout(function () {
            socket = atmosphereService.subscribe(request);
        }, request.reconnectInterval);
    };

    request.onReopen = function (response) {
        $scope.model.connected = true;
        $scope.model.content = 'Atmosphere re-connected using ' + response.transport;
        socket.push(angular.toJson({ test: 'test' }));
    };

    ...

    request.onMessage = function (response) {
        var responseText = response.responseBody;
        try {
            $scope.model.values = angular.fromJson(responseText);
            socket.push(angular.toJson({ test: 'test' }));
        } catch (e) {
            $log.error("Error parsing JSON: ", responseText);
            throw e;
        }
    };

    ...

    socket = atmosphereService.subscribe(request);

那么,缺少什么来使这个响应所有客户而不只是一个?

谢谢!

0 个答案:

没有答案
相关问题