Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BlazeDS StreamingAMF:如何检测flex客户端何时关闭连接?_Java_Apache Flex_Blazeds - Fatal编程技术网

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

Java BlazeDS StreamingAMF:如何检测flex客户端何时关闭连接?,java,apache-flex,blazeds,Java,Apache Flex,Blazeds,我有一个Flex应用程序,它使用StreamingAMF通道连接到BlazeDS服务器。 在服务器端,逻辑由扩展ActionScriptAdapter并实现FlexSessionListener和FlexClientListener接口的自定义适配器处理 我在问,例如,当用户关闭浏览器时,如何检测哪个“flex客户端”关闭了连接?(这样我可以清理数据库中的一些信息) 我尝试使用以下方法: 1。要手动管理命令消息: @Override public Object manage(fi

我有一个Flex应用程序,它使用StreamingAMF通道连接到BlazeDS服务器。 在服务器端,逻辑由扩展ActionScriptAdapter并实现FlexSessionListener和FlexClientListener接口的自定义适配器处理

我在问,例如,当用户关闭浏览器时,如何检测哪个“flex客户端”关闭了连接?(这样我可以清理数据库中的一些信息)

我尝试使用以下方法:

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);
    }
但是客户的总是不同于来的客户

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方法永远不会被调用:(

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


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

我使用自定义适配器和带有已连接客户端列表的静态类,按照以下方式创建会话

@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;
}
-

代码信息: AddInfo AboutUser()clearUserinfo()是类中的私有方法,用于管理连接客户端的静态列表

@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;
}
-


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

与您有相同的问题…通过BlazeDS的“黑客”解决了它…我在我的confluence上记录了它。也许这有助于解决您的问题: