Количество пользователей (сессий) в кластере

#java #web-applications #spring-security #weblogic-10.x

#java #веб-приложения #spring-безопасность #weblogic-10.x

Вопрос:

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

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

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

Ответ №1:

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

Комментарии:

1. если я увеличу счетчик в sessionCreated и уменьшу в sessionDestroyed , то как насчет внезапно убитых серверов, которые не уменьшают счетчики?

2. это редкие случаи.. как вы обрабатываете данные сеанса пользователя, когда сервер выходит из строя ?? .. Возможные решения 1. вы можете использовать пропускную способность сервера по обработке пользователей в качестве эталона для уменьшения счетчика при выходе сервера из строя. 2. сохраняйте счетчик в базе данных вместе с идентификатором сервера .. скажем, Server1 — > 5, Server3-> 130 .. затем уменьшайте счетчик, когда сервер выходит из строя .. надеюсь, это поможет.

Ответ №2:

Простое руководство, демонстрирующее, как определять активных пользователей / сеансы в веб-приложении 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 ->

Eclipse

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

Firefox

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

IE

  1. Вывод на консоль ->

Консоль

Подробнее:http://www.hubberspot.com/2013/09/how-to-determine-active-users-sessions.html