BlazeDS StreamingAMF: Как определить, когда клиент Flex закрывает соединение? - PullRequest
3 голосов
/ 13 мая 2010

У меня есть приложение Flex, которое подключается к серверу BlazeDS по каналу StreamingAMF. На стороне сервера логика обрабатывается специальным адаптером, который расширяет ActionScriptAdapter и реализует интерфейсы FlexSessionListener и FlexClientListener.

Я спрашиваю, как я могу определить, какой "flex-client" закрыл соединение, когда, например, пользователь закрывает браузер? (так что я могу очистить некоторые данные в базе данных)

Я пытался использовать следующее:

1. Чтобы вручную управлять сообщениями команд:

    @Override
    public Object manage(final CommandMessage commandMessage) {
        switch (commandMessage.getOperation()) {
            case CommandMessage.SUBSCRIBE_OPERATION:
                System.out.println("SUBSCRIBE_OPERATION = " + commandMessage.getHeaders());
                break;
            case CommandMessage.UNSUBSCRIBE_OPERATION:
                System.out.println("UNSUBSCRIBE_OPERATION = " + commandMessage.getHeaders());               
                break;
        }
        return super.manage(commandMessage);
    }

Но clientID всегда отличаются от тех, которые пришли.

2. Прослушивание событий sessionDestroyed и clientDestroyed

    @Override
    public void clientCreated(final FlexClient client) {
        client.addClientDestroyedListener(this);
        System.out.println("clientCreated = " + client.getId());
    }

    @Override
    public void clientDestroyed(final FlexClient client) {
        System.out.println("clientDestroyed = " + client.getId());
    }

    @Override
    public void sessionCreated(final FlexSession session) {
        System.out.println("sessionCreated = " + session.getId());
        session.addSessionDestroyedListener(this);
    }

    @Override
    public void sessionDestroyed(final FlexSession session) {
        System.out.println("sessionDestroyed = " + session.getId());
    }

Но эти методы sessionDestroyed и clientDestroyed никогда не вызываются. (

Ответы [ 3 ]

2 голосов
/ 13 октября 2010

Я сделал это следующим образом, используя пользовательский адаптер и статический класс со списком подключенных клиентов.

@Override
public Object manage(final CommandMessage commandMessage) {
    switch (commandMessage.getOperation()) {
        case CommandMessage.SUBSCRIBE_OPERATION:
                // add user info
                // be aware - each time the selector changes this method is called. So when you add user info check to see if you are not duplicating the clients.
                addInfoAboutUser(commandMessage.getHeader("DSId").toString(), commandMessage.getClientId().toString());
                break;
        case CommandMessage.UNSUBSCRIBE_OPERATION:
                clearUserInfo(commandMessage.getClientId().toString());
                break;
    }
    return null;
}

-

Код ИНФО: addInfoAboutUser () и clearUserinfo () - это частные методы в моем классе, которые управляют статическим списком подключенных клиентов.

-

ПРИМЕЧАНИЕ: при изменении селектора со стороны гибкого клиента метод manage () будет вызываться дважды: 1-й для отмены подписки и 2-й для подписки с новым селектором.

1 голос
/ 12 ноября 2010

Была та же проблема, что и у вас ... она была решена путем "взлома" BlazeDS ... Я задокументировал это на своем слиянии. Возможно, это поможет с вашей проблемой: http://dev.c -ware.de / слияния / дисплей / PUBLIC / Litening + для + BlazeDS + клиент + логины + и + * 1003 выходов из *

1 голос
/ 13 мая 2010

Вам нужно перехватить событие onbeforeunload и вызвать метод на сервере, который очистит все данные, относящиеся к клиенту. В противном случае клиент Flex не сможет автоматически определить, выгружен ли он.

Сессия должна быть уничтожена при превышении максимального интервала бездействия ... если файл web.xml настроен правильно.

...