Получение списка активных сессий в Tomcat с использованием Java - PullRequest
23 голосов
/ 01 ноября 2010

Я занимаюсь разработкой проекта на Java, в котором я хочу подсчитать все активные сессии в Tomcat. Исходя из этого, я хочу посмотреть, сколько из этих пользователей активно и фактически используют приложение.

Ответы [ 8 ]

18 голосов
/ 21 июня 2012

Вы должны использовать JMX (Java Managemnet eXtension) и запросить следующее

jmxObjectName:    Catalina:host=localhost,path=/,type=Manager
jmxAttributeName: activeSessions

Вы можете использовать jconsole для доступа к этим данным. Чтобы запустить jmx, см. http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html

У вас есть много преимуществ при использовании JMX, поскольку вы также получаете много других данных. Вы можете поместить его в плагин munin и позволить munin следить за ним и рисовать хорошие графики для просмотра.

15 голосов
/ 01 ноября 2010

Нет способа получить счетчик сеансов напрямую от tomcat. Но вы можете создать и зарегистрировать слушатель сеанса и увеличить счетчик при его создании. Вот пример:

http://tomcat -configure.blogspot.com / 2009/01 / кот-сессия-слушателем-example.html

public class SessionCounter implements HttpSessionListener {

  private static int activeSessions = 0;

  public void sessionCreated(HttpSessionEvent se) {
    activeSessions++;
  }

  public void sessionDestroyed(HttpSessionEvent se) {
    if(activeSessions > 0)
      activeSessions--;
    }

  public static int getActiveSessions() {
     return activeSessions;
  }
}
3 голосов
/ 09 ноября 2015

Вот фрагмент кода JMX в стиле Java 7 (что basZero запросил и точно выполняет работу, описанную Дженнингом):

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
try(JMXConnector jmxc = JMXConnectorFactory.connect(url)) {
  MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
  ObjectName mbeanName = new ObjectName("Catalina:type=Manager,context=/,host=localhost");
  Object value = mbsc.getAttribute(mbeanName, "activeSessions");
}

Конечно, вам нужно заменить корневой контекст (/) в ObjectName строкой контекста вашего приложения, если он не развернут в корневом контексте. Смотрите мое подробное объяснение проблемы Catalina JMX здесь: Программный доступ к встроенным MBeans в Tomcat

2 голосов
/ 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

Браузер Firefox ->

Firefox

Браузер Internet Explorer ->

IE

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

Console

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

2 голосов
/ 02 марта 2016

Вот как можно получить счетчик сеансов локально, если вы получаете статистику в приложении, запущенном на сервере Tomcat, для которого вы хотите получить статистику.Нет необходимости включать JMX Remote таким образом:

public void init(final ServletConfig config) throws ServletException
{
    context = config.getServletContext().getContextPath();
}
//...
private void getSessionStats()
{
    MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
    ObjectName objectName = new ObjectName("Catalina:type=Manager,context="+context+",host=localhost");
    Object activeSessions = mBeanServer.getAttribute(objectName, "activeSessions");
    System.out.println(activeSessions);
}
2 голосов
/ 22 июля 2015

Если вам не нужны значения в реальном веб-приложении, скрипт groovy может помочь:

import javax.management.remote.*
import javax.management.*
import groovy.jmx.builder.*

// Setup JMX connection.
def connection = new JmxBuilder().client(port: 4934, host: '192.168.10.6')
connection.connect()

// Get the MBeanServer.
def mbeans = connection.MBeanServerConnection

def activeBean = new GroovyMBean(mbeans, 'Catalina:type=Manager,host=localhost,context=/')
println "Active sessions: " + activeBean['activeSessions']

Если вы хотите реальные сессии, у вас есть методы для их получения, например:

def sessions = activeBean.listSessionIds().tokenize(' ');
1 голос
/ 07 ноября 2012

PSI Probe может помочь вам: http://code.google.com/p/psi-probe/

0 голосов
/ 20 марта 2019

Вы можете присоединить jolokia jvm agent к запущенному tomcat и запросить атрибут activeSessions из соответствующих MBeans через curl.

java -jar agent.jar start [TOMCAT-PID]
curl 'http://127.0.0.1:8778/jolokia/read/Catalina:context=*,host=*,type=Manager/activeSessions'
java -jar agent.jar stop [TOMCAT-PID]

Это даст вам что-то вроде

{  
   "request":{  
      "mbean":"Catalina:context=*,host=*,type=Manager",
      "attribute":"activeSessions",
      "type":"read"
   },
   "value":{  
      "Catalina:context=\/SampleApp,host=localhost,type=Manager":{  
         "activeSessions":1
      }
   },
   "timestamp":1553105659,
   "status":200
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...