Я разрабатываю проект на Java, в котором я хочу подсчет всех активных сеансов в Tomcat. Исходя из этого, я хочу посмотреть, сколько из этих пользователей активно и фактически использует приложение.
Получение списка активных сеансов в Tomcat с использованием Java
Ответ 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 →
- Браузер Internet Explorer →
- Консольный выход →
Подробнее: 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 (см. скриншот ниже)
2. JavaMelody
Вы также можете использовать инструмент мониторинга приложений JavaEE, например JavaMelody, который помогает вам контролировать приложения Java или Java EE в QA и производственных средах.