2013-12-02 4 views
1

Используя пример чата, когда я закрываю окно браузера, я никогда не вижу метод @Disconnect.Atmosphere @Disconnect не вызывается при закрытии окна браузера

Вот моя служба: -

package org.atmosphere.samples.chat; 

import java.io.IOException; 

import org.atmosphere.config.service.Disconnect; 
import org.atmosphere.config.service.ManagedService; 
import org.atmosphere.config.service.Ready; 
import org.atmosphere.cpr.AtmosphereResource; 
import org.atmosphere.cpr.AtmosphereResourceEvent; 
import org.atmosphere.cpr.AtmosphereResourceEventListenerAdapter; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@ManagedService(path = "{room: [a-zA-Z][a-zA-Z_0-9]*}") 
public class Chat 
{ 
    private static final Logger LOGGER = LoggerFactory.getLogger(Chat.class); 

    @Ready 
    public void onReady(final AtmosphereResource inAtmosphereResource) 
    { 
     LOGGER.info("Browser {} connected.", inAtmosphereResource.uuid()); 
    } 
    @Disconnect 
    public void onDisconnect(AtmosphereResourceEvent event) 
    { 
     if (event.isCancelled()) 
     { 
      LOGGER.info("Browser {} unexpectedly disconnected", event.getResource().uuid()); 
     } 
     else if (event.isClosedByClient()) 
     { 
      LOGGER.info("Browser {} closed the connection", event.getResource().uuid()); 
     } 
     else 
     { 
      LOGGER.info("close event was called, but I know not why"); 
     } 
    } 

    @org.atmosphere.config.service.Message(encoders = { JacksonEncoder.class }, decoders = { JacksonDecoder.class }) 
    public Message onMessage(Message message) throws IOException 
    { 
     LOGGER.info("{} just send {}", message.getAuthor(), message.getMessage()); 
     return message; 
    } 
} 

Вот мои JS: -

$(function() { 
"use strict"; 

var header = $('#header'); 
var content = $('#content'); 
var input = $('#input'); 
var status = $('#status'); 
console.log(document.location.hash); 
var bookingNumber = document.location.hash.substring(1, document.location.hash.length); 
console.log(bookingNumber); 
var myName = false; 
var author = null; 
var logged = false; 
var socket = $.atmosphere; 
var subSocket; 
var transport = 'websocket'; 

// We are now ready to cut the request 
var request = { url: document.location.toString().replace(/#.*/, "") + 'chat/' + bookingNumber, 
    contentType : "application/json", 
    trackMessageLength : true, 
    shared : true, 
    logLevel : "debug", 
    transport : transport , 
    fallbackTransport: 'long-polling'}; 

request.onOpen = function(response) { 
    content.html($('>p<', { text: 'Atmosphere connected using ' + response.transport })); 
    input.removeAttr('disabled').focus(); 
    status.text('Choose name:'); 
    transport = response.transport; 

    if (response.transport == "local") { 
     subSocket.pushLocal("Name?"); 
    } 
}; 

request.onTransportFailure = function(errorMsg, request) { 
    jQuery.atmosphere.info(errorMsg); 
    if (window.EventSource) { 
     request.fallbackTransport = "sse"; 
     transport = "see"; 
    } 
    header.html($('<h3>', { text: 'Atmosphere Chat. Default transport is WebSocket, fallback is ' + request.fallbackTransport })); 
}; 

request.onMessage = function (response) { 

    // We need to be logged first. 
    if (!myName) return; 

    var message = response.responseBody; 
    try { 
     var json = jQuery.parseJSON(message); 
    } catch (e) { 
     console.log('This doesn\'t look like a valid JSON: ', message.data); 
     return; 
    } 

    if (!logged) { 
     logged = true; 
     status.text(myName + ': ').css('color', 'blue'); 
     input.removeAttr('disabled').focus(); 
     subSocket.pushLocal(myName); 
    } else { 
     input.removeAttr('disabled'); 

     var me = json.author == author; 
     var date = typeof(json.time) == 'string' ? parseInt(json.time) : json.time; 
     addMessage(json.author, json.message, me ? 'blue' : 'black', new Date(date)); 
    } 
}; 

request.onClose = function(response) { 
    logged = false; 
} 

subSocket = socket.subscribe(request); 
input.keydown(function(e) { 
    if (e.keyCode === 13) { 
     var msg = $(this).val(); 
     if (author == null) { 
      author = msg; 
     } 

     subSocket.push(jQuery.stringifyJSON({ author: author, message: msg })); 
     $(this).val(''); 

     input.attr('disabled', 'disabled'); 
     if (myName === false) { 
      myName = msg; 
     } 
    } 
}); 

function addMessage(author, message, color, datetime) { 
    content.append('<p><span style="color:' + color + '">' + author + '</span> @ ' + 
     + (datetime.getHours() < 10 ? '0' + datetime.getHours() : datetime.getHours()) + ':' 
     + (datetime.getMinutes() < 10 ? '0' + datetime.getMinutes() : datetime.getMinutes()) 
     + ': ' + message + '</p>'); 
    } 
}); 

Я бегу на GlassFish 3, с веб-сокеты и кометы включена.

UPDATE Я забыл упомянуть, что я использую V 2.1.0RC1

ответ

1

испытанный с GF 3.1.2.2:

BLOCKQUOTE [# | 2013-12-02T10: 43: 24,743 -0500 | ИНФО | glassfish3.1.2 | javax.enterprise.system.std.com.sun.enterprise.server.logging | _ThreadID = 25; _ThreadName = HTTP-нить бассейн-8080 (4); | 10: 43: 24,743 [http-thread-pool-8080 (4)] INFO org.atmosphere.samples.chat.Chat - Браузер 0f7f5596-bd25-4dda-a488-1357da8487f5 закрыл соединение

Давайте обсуждать Атмосферу ML в случае, если вы все еще испытываете проблемы. Я тестировал образец BTW.

- Jeanfrancois

Смежные вопросы