Подтвердить что ты не робот

Получение списка активных сеансов в Tomcat с использованием Java

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

4b9b3361

Ответ 1

Вы должны использовать 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 контролировать его и рисовать красивые графики, чтобы посмотреть.

Ответ 2

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

http://tomcat-configure.blogspot.com/2009/01/tomcat-session-listener-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

Вот фрагмент кода 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

Ответ 4

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

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(' ');

Ответ 5

Вот как получить счет сессии локально, если вы получаете статистику в приложении, запущенном на сервере 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);
}

Ответ 6

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

 }

}

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

  • Браузер Eclipse →

Eclipse

  1. Браузер Firefox →

Firefox

  1. Браузер Internet Explorer →

IE

  1. Консольный выход →

Консоль

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

Ответ 8

Вы можете присоединить jvokia 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
}

Ответ 9

Добавьте еще два подхода, оба из которых я использовал все время.

1. VisualVM

Чтобы узнать количество активных сеансов, вы можете использовать внутреннюю статистику Tomcat, доступ к которой можно получить с помощью JMX (Java Management Extension).

Практически, инструмент профилирования, такой как VisualVM или Java VisualVM, может использоваться для доступа к статистике JMX, такой как количество активных сессий, на вкладке MBeans (см. скриншот ниже)

enter image description here

2. JavaMelody

Вы также можете использовать инструмент мониторинга приложений JavaEE, например JavaMelody, который помогает вам контролировать приложения Java или Java EE в QA и производственных средах.

enter image description here