【发布时间】:2014-09-19 15:59:21
【问题描述】:
我想知道有多少用户实时连接到我的应用程序。我有想法循环打开的会话数,但我找不到如何做到这一点。如果您有其他方法可以做到这一点,欢迎您提出建议。
【问题讨论】:
我想知道有多少用户实时连接到我的应用程序。我有想法循环打开的会话数,但我找不到如何做到这一点。如果您有其他方法可以做到这一点,欢迎您提出建议。
【问题讨论】:
目前我发现的最佳解决方案是在创建和销毁会话时对其进行计数。
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
@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());
}
}
【讨论】:
Servlet 类添加到我的UI 中,但它不会增加计数器。我还有什么需要改变的吗?
com.vaadin.server.VaadinServlet
Servlet 放在另一个java 类中并在我的web.xml 中更改Servlet 位置时,它起作用了。谢谢伙计,这个主意很好。
这是一个错误的答案。我错误地认为引用的方法回答了问题,但事实并非如此。 将此视为撤回;而不是删除这个答案,我会留下它,以免其他人犯我的错误。
VaadinSession.getAllSessions()Vaadin 7.2 添加了一个静态方法,VaadinSession.getAllSessions。有关历史,请参阅Ticket # 13053。
该方法返回附加到单个 HttpSession 的 VaadinSession 对象中的 Collection。
此方法告诉您单个用户的 HttpSession 运行了多少 VaadinSession 对象,但不告诉您 Vaadin 应用服务器上有多少总用户。
【讨论】: