使用Java获取Tomcat中的活动会话列表

时间:2010-11-01 13:49:55

标签: java tomcat

我正在用Java开发一个项目,我希望在Tomcat中计算所有活动会话。基于此,我想看看有多少用户处于活动状态并实际使用该应用程序。

9 个答案:

答案 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--;
  }

    }

}

计划的输出:

  1. Eclipse浏览器 - >
  2. Eclipse

    1. Firefox浏览器 - >
    2. Firefox

      1. Internet Explorer浏览器 - >
      2. IE

        1. 控制台输出 - >
        2. Console

          更多信息: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管理扩展)进行访问。

实际上,可以使用VisualVMJava VisualVM之类的配置工具来访问JMX统计信息,例如MBeans选项卡上的活动会话数(请参见屏幕截图下方)

enter image description here

2。 JavaMelody

您还可以使用JavaEE应用程序监视工具,例如JavaMelody,该工具可以帮助您监视QA和生产环境中的Java或Java EE应用程序。

enter image description here