Количество пользователей (сеансов) в кластере - PullRequest
4 голосов
/ 09 мая 2011

Есть ли хороший способ получить количество зарегистрированных пользователей в веб-приложении Java, работающем в кластере?

Я написал простое HttpSessionListener со статическим полем, но я полагаю, что это не так.не работает в кластере.Я вижу, что есть решение Spring Security, но на некоторых форумах я читал, что в кластере это все еще не так.

Продукт, в котором мне нужно реализовать это количество пользователей, пытается быть независимым от сервера приложений,В настоящее время мы поддерживаем Tomcat, Weblogic и JBoss.На данный момент мне нужно решение для кластеров Weblogic 10.3.

Ответы [ 2 ]

4 голосов
/ 09 мая 2011

Вы можете сохранить счетчик в базе данных, который будет работать в кластере env.

0 голосов
/ 08 декабря 2017

Простое руководство, демонстрирующее, как определять активных пользователей / сеансы в веб-приложении Java.

package com.hubberspot.javaee.listener;

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

@WebListener
public class OnlineUsersCounter implements HttpSessionListener {

private static int numberOfUsersOnline;

 public OnlineUsersCounter() {
  numberOfUsersOnline = 0;
 }

 public static int getNumberOfUsersOnline() { 
  return numberOfUsersOnline;
 }

    public void sessionCreated(HttpSessionEvent event) {

     System.out.println("Session created by Id : " + event.getSession().getId());
     synchronized (this) {
   numberOfUsersOnline++;
  }

    }

    public void sessionDestroyed(HttpSessionEvent event) {

     System.out.println("Session destroyed by Id : " + event.getSession().getId());
     synchronized (this) {
   numberOfUsersOnline--;
  }

    }

}

Запуск приведенного ниже сервлета в трех разных браузерах приведет к выводу: (см. Рис. Ниже)

package com.hubberspot.javaee;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.hubberspot.javaee.listener.OnlineUsersCounter;

// @WebServlet annotation has a initParams field which takes
// in initialization parameters for a servlet.
// @WebInitParam annotation takes in a name and value for the
// initialization parameters for the current Servlet.

@WebServlet(name = "HelloWorldServlet" , urlPatterns = { "/HelloWorldServlet" }
, initParams = { @WebInitParam(name = "user" , value = "Jonty") })
public class HelloWorldServlet extends HttpServlet {

 protected void doGet(
   HttpServletRequest request, 
   HttpServletResponse response
   ) throws ServletException, IOException {

  response.setContentType("text/html");

  PrintWriter out = response.getWriter();

  // sessionCreated method gets executed
  HttpSession session = request.getSession();

  session.setMaxInactiveInterval(60);

  try {
   out.println("<html>");
   out.println("<body>");
   out.println("<h2>Number of Users Online : "
      + OnlineUsersCounter.getNumberOfUsersOnline() 
      + "</h2>");
   out.println("</body>");
   out.println("</html>");
  } finally {
   out.close();
  }

 }

}

Вывод программы:

  1. Eclipse Browser ->

Eclipse

  1. Браузер Firefox ->

Firefox

  1. Браузер Internet Explorer ->

IE

  1. Консольный вывод ->

Console

Для более: http://www.hubberspot.com/2013/09/how-to-determine-active-users-sessions.html

...