我们正在尝试添加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);
那么,缺少什么来使这个响应所有客户而不只是一个?
谢谢!