BlazeDS StreamingAMF:如何检测Flex客户端何时关闭连接?

时间:2010-05-13 12:17:13

标签: java flex blazeds

我有一个使用StreamingAMF频道连接到BlazeDS服务器的Flex应用程序。 在服务器端,逻辑由自定义适配器处理,该适配器扩展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 个答案:

答案 0 :(得分:2)

我通过以下方式使用自定义适配器和带有已连接客户端列表的静态类。

@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()是我班级中用于管理已连接客户端静态列表的私有方法。

-

注意:当从Flex客户端更改选择器时,manage()方法将被调用两次:1st取消订阅,第二次订阅新选择器。

答案 1 :(得分:1)

您需要捕获事件onbeforeunload并在服务器上调用一个方法,该方法将清除所有与客户端相关的数据。否则,Flex客户端无法自动检测到它已卸载。

当超出最大不活动时间间隔时,应该销毁会话...如果正确配置了web.xml。

答案 2 :(得分:1)

和你一样的问题......通过BlazeDS的“破解”来解决它...我在汇合处记录了它。也许它有助于解决您的问题: http://dev.c-ware.de/confluence/display/PUBLIC/Litening+for+BlazeDS+client+logins+and+logouts