2

我有一个 GWT 客户端-服务器应用程序,我想在客户端浏览器标题中显示正在运行的客户端数量。我知道如何跟踪连接客户端的数量,但如何跟踪关闭的连接数量?

public class MyServiceImpl extends RemoteServiceServelt implements MyService
{
 [...]
 static int runningClients=0;
 @Override public Integer runningClients() {return ++runningClients;}
 // TODO: track closed connections
}

编辑:按照建议,我实现了一个 HTTPSessionListener。不幸的是,它总是为 hits 和 connectedClients 返回 0。

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class ActiveClientsListener implements HttpSessionListener
{   
    private static long hits = 0;
    private static long numberOfConnectedClients = 0;

    public static long hits() {return hits;}
    public static long numberOfConnectedClients() {return numberOfConnectedClients;}

    @Override public synchronized void sessionCreated(HttpSessionEvent arg0)
    {
        hits++;
        numberOfConnectedClients++;
    }

    @Override public synchronized void sessionDestroyed(HttpSessionEvent arg0)
    {
        numberOfConnectedClients--;
    }
}

web.xml

...
<listener>
 <listener-class>org.mypackage.server.ActiveClientsListener</listener-class>
</listener>
...

PS:我的实现是线程安全的还是我必须制作字段volatile或以不同的方式同步?

4

1 回答 1

4

假设每个连接的客户端都打开一个会话,我想我会为此目的使用HttpSessionListener 。

创建会话时,您增加一个计数器,每当它被销毁时,减少它。确保同步对变量的访问。

当然,只要会话超时,计数器就会减少,这可能“为时已晚”。但是,您可以通过在用户离开您的应用程序时(使用addWindowClosingHandler )显式销毁会话(session.invalidate() )来改善这一点。

于 2012-05-15T13:13:26.343 回答