我正在使用角(1.5.x)中的SockJS + stomp客戶端與彈簧(mvc)服務器建立websocket。除此之外,所有的工作都可以正常工作:如果我終止了服務器,那麼stomp客戶端在瀏覽器上檢測連接錯誤需要兩分鐘的時間。有一種方法可以在服務器死亡或斷開連接後立即管理更短(或立即)的超時或拋出事件嗎?stompjs xhr_streaming超時
function socketService($rootScope, $q, $log, $timeout, URL) {
var listener = $q.defer(),
socket = {
client: null,
stomp: null
};
var reconnect = function() {
$log.info('Reconnecting');
$timeout(function() {
initialize();
}, 2000);
};
var getMessage = function(data) {
var message = JSON.parse(data), out = {};
out.message = message;
if (message.metadata) {
out.time = new Date(message.metadata.timestamp);
}
$log.info(out);
return out;
};
var startListener = function() {
$log.info('Connected');
socket.stomp.subscribe(URL.PROCESS_UPDATES, function(data) {
listener.notify(getMessage(data.body));
});
socket.stomp.subscribe(URL.CONTAINER_UPDATES, function(data) {
listener.notify(getMessage(data.body));
});
$rootScope.$broadcast('web_socket_event', 'CONNECTED');
};
var errorCallback = function (error) {
// Browser gets here 2 minutes after the server is killed. Seems like might be affected by the the xhr_streaming timeout
$rootScope.$broadcast('web_socket_event', 'DISCONNECTED');
reconnect();
};
return {
initialize: initialize,
receive: receive
};
function initialize() {
var header = {
'accept-version': 1.1
};
$log.info('Connecting');
// custom header to specify version.
socket.client = new SockJS(header, URL.ROOT + URL.UPDATES);
socket.client.debug = function(){};
socket.stomp.heartbeat.outgoing = 0;
socket.stomp.heartbeat.incoming = 2000;
socket.stomp = Stomp.over(socket.client);
socket.stomp.connect({}, startListener, errorCallback);
socket.stomp.onerror = errorCallback;
socket.stomp.onclose = reconnect;
};
function receive() {
return listener.promise;
};
}
**// browser console:**
Opening Web Socket...
stomp.js:145 Web Socket Opened...
stomp.js:145 >>> CONNECT
accept-version:1.1,1.0
heart-beat:0,2000
stomp.js:145 <<< CONNECTED
version:1.1
heart-beat:2000,0
stomp.js:145 connected to server undefined
stomp.js:145 check PONG every 2000ms
你可以發佈用於創建連接的javascript代碼,是你訂閱一個回調函數到連接錯誤事件? – artemisian
@artemisian請參閱上面的代碼,謝謝! – user2994871
請添加'socket.client.debug = function(msg){console.log(msg)};'並檢查心跳協商(在控制檯中搜索心跳)?如果在服務器斷開連接時打印任何消息 – artemisian