Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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 如何在Vaadin获得所有会话_Java_Session_Vaadin - Fatal编程技术网

Java 如何在Vaadin获得所有会话

Java 如何在Vaadin获得所有会话,java,session,vaadin,Java,Session,Vaadin,我想知道有多少用户实时连接到我的应用程序。我有一个想法,循环打开的会话数,但我找不到如何做。如果你有其他方法,欢迎你的建议 到目前为止,我找到的最佳解决方案是在创建和销毁会话时对会话进行计数 public class VaadinSessionListener{ private static volatile int activeSessions = 0; public static class VaadinSessionInitListener implements Ses

我想知道有多少用户实时连接到我的应用程序。我有一个想法,循环打开的会话数,但我找不到如何做。如果你有其他方法,欢迎你的建议

到目前为止,我找到的最佳解决方案是在创建和销毁会话时对会话进行计数

public class VaadinSessionListener{

    private static volatile int activeSessions = 0;

    public static class VaadinSessionInitListener implements SessionInitListener{

        @Override
        public void sessionInit(SessionInitEvent event) throws ServiceException {

            incSessionCounter();            
        }
    }

    public static class VaadinSessionDestroyListener implements SessionDestroyListener{

        @Override
        public void sessionDestroy(SessionDestroyEvent event) {

            /*
             * check if HTTP Session is closing
             */
            if(event.getSession() != null && event.getSession().getSession() != null){

                decSessionCounter();
            }
        }
    }


    public static Integer getActiveSessions() {
        return activeSessions;
    }

    private synchronized static void decSessionCounter(){
        if(activeSessions > 0){
            activeSessions--;
        }
    }

    private synchronized static void incSessionCounter(){
        activeSessions++;
    }
}
然后在VaadinServlet init()方法中添加SessionListeners

[撤回] 这里有一个错误的答案。我错误地认为引用的方法回答了这个问题,但事实并非如此将此视为撤回;我不会删除这个答案,而是留下它,这样别人就不会犯我的错误了


VaadinSession.getAllSessions()
Vaadin 7.2增加了一个静态方法。有关历史,请参见

该方法返回附加到单个对象的一组对象


此方法会告诉您单个用户的HttpSession运行了多少个VaadinSession对象,但不会告诉您Vaadin应用程序服务器上有多少用户。

它不起作用!我在我的
UI
中添加了
Servlet
类,但它没有增加计数器。还有什么我必须更改的吗?Servlet类应该已经在UI中可用了。您使用的是哪个vaadin版本和servlet版本?带Maven的vaadin 7.2。我在Web.xml中使用了
com.vaadin.server.VaadinServlet
,我的代码示例是针对Servlet3.0规范的。您可能还需要在web.xml中添加正确的Servlet。web.xml中的com.vaadin.server.VaadinServlet是错误的。当我将
Servlet
放在另一个java类中并更改
Servlet
web.xml
中的位置时,它起作用了。谢谢,这个主意很好。这将返回给定http会话的vaadin会话。为了实现所要求的功能,需要按照此处所述收集http会话:或者使用Vaadin SessionInitListener
@WebServlet(urlPatterns = "/*", asyncSupported = true)
@VaadinServletConfiguration(productionMode = true, ui = MyUI.class)
public static class Servlet extends VaadinServlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

        super.init(servletConfig);


        /*
         * Vaadin SessionListener
         */
        getService().addSessionInitListener(new VaadinSessionListener.VaadinSessionInitListener());
        getService().addSessionDestroyListener(new VaadinSessionListener.VaadinSessionDestroyListener());    
    }
}