Java BlazeDS StreamingAMF:如何检测flex客户端何时关闭连接?
我有一个Flex应用程序,它使用StreamingAMF通道连接到BlazeDS服务器。 在服务器端,逻辑由扩展ActionScriptAdapter并实现FlexSessionListener和FlexClientListener接口的自定义适配器处理 我在问,例如,当用户关闭浏览器时,如何检测哪个“flex客户端”关闭了连接?(这样我可以清理数据库中的一些信息) 我尝试使用以下方法: 1。要手动管理命令消息: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
@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上记录了它。也许这有助于解决您的问题: