Получение списка активных сеансов в Tomcat с использованием Java
Я разрабатываю проект на Java, в котором я хочу подсчет всех активных сеансов в Tomcat. Исходя из этого, я хочу посмотреть, сколько из этих пользователей активно и фактически использует приложение.
Ответы
Ответ 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]()
- Браузер Firefox →
![Firefox]()
- Браузер Internet Explorer →
![IE]()
- Консольный выход →
![Консоль]()
Подробнее: http://www.hubberspot.com/2013/09/how-to-determine-active-users-sessions.html
Ответ 7
"PSI Probe" может помочь вам: http://code.google.com/p/psi-probe/
Ответ 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]()