当我们关闭浏览器窗口时,不会调用大气@Disconnect

时间:2013-12-02 05:05:49

标签: 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上运行,启用了网络套接字和彗星。

更新我忘了提到我使用的是v 2.1.0RC1

1 个答案:

答案 0 :(得分:1)

用GF 3.1.2.2测试:

  

块引用   [#| 2013-12-02T10:43:24.743-0500 | INFO | 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