我正在用Java开发一个项目,我希望在Tomcat中计算所有活动会话。基于此,我想看看有多少用户处于活动状态并实际使用该应用程序。
答案 0 :(得分:18)
您应该使用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监控它并绘制漂亮的图形来查看。
答案 1 :(得分:15)
没有任何方法可以直接从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;
}
}
答案 2 :(得分:3)
这是Java 7风格的JMX代码片段(basZero要求的内容以及Janning所描述的工作):
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问题的详细说明:Accessing built-in MBeans in Tomcat programatically
答案 3 :(得分:2)
如果您不需要实际Web应用程序中的值,则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(' ');
答案 4 :(得分:2)
如果您要在tomcat服务器上运行的应用程序中获取您想要的统计信息,那么如何在本地获取会话数。无需以这种方式启用jmx:
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);
}
答案 5 :(得分:1)
PSI Probe可以为您解决问题:http://code.google.com/p/psi-probe/
答案 6 :(得分:1)
一个简单的教程,演示如何确定Java Web应用程序中的活动用户/会话。
score
在三个不同的浏览器上运行以下servlet将提供输出:(见下图)
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--;
}
}
}
计划的输出:
更多信息:http://www.hubberspot.com/2013/09/how-to-determine-active-users-sessions.html
答案 7 :(得分:0)
您可以将jolokia jvm agent附加到正在运行的tomcat,并通过curl从相关MBean中查询activeSessions
属性。
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
}
答案 8 :(得分:0)
还有两种添加方法,我一直都在使用这两种方法。
1。 VisualVM
要了解活动会话的数量,可以使用Tomcat的内部统计信息,可以使用JMX(Java管理扩展)进行访问。
实际上,可以使用VisualVM或Java VisualVM之类的配置工具来访问JMX统计信息,例如MBeans选项卡上的活动会话数(请参见屏幕截图下方)>
2。 JavaMelody
您还可以使用JavaEE应用程序监视工具,例如JavaMelody,该工具可以帮助您监视QA和生产环境中的Java或Java EE应用程序。