Количество активных сеансов в Tomcat

У меня есть файл jar веб-сервисов, развернутый под webapps\nyx\WEB-INF\services на моем сервере tomcat. Теперь я пытаюсь получить активные сеансы, используя приведенный ниже код внутри метода веб-службы.

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName("Catalina:type=Manager,context=/nyx/services,host=localhost");
Object activeSessions =mBeanServer.getAttribute(objectName,"activeSessions");

Но это дает мне исключение Экземпляр не найден.
Может ли кто-нибудь помочь мне со значением атрибута контекста?


person Shelly    schedule 18.01.2019    source источник
comment
возможный дубликат stackoverflow.com/questions/4069444/   -  person some IT dood    schedule 18.01.2019
comment
Я проверил это. Но проблема здесь в том, какой контекст я должен использовать, когда веб-службы развернуты в каталоге webapps\nyx\WEB-INF\services.   -  person Shelly    schedule 18.01.2019


Ответы (1)


Попробуйте обратиться к этому SO question, чтение вашего кода первое, что я думаю, это попробовать использовать JMX (Java Management eXtension)

Что-то вроде этого:

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");
}

ИЗМЕНИТЬ

Если вам нужно получить количество сеансов локально, ваш код должен подойти, попробуйте использовать свой код, но получая контекст во время выполнения. Переопределить метод инициализации:

@Override
public void init(final ServletConfig config) throws ServletException {
    context = config.getServletContext().getContextPath();
}

Затем передайте его как параметр ObjectName:

ObjectName objectName = new ObjectName("Catalina:type=Manager,context="+context+",host=localhost");
person Roberto Manfreda    schedule 18.01.2019
comment
Привет, спасибо за ваш ответ. Я пробовал это, но это дает мне java.io.IOException: не удалось получить заглушку RMIServer: javax.naming.CommunicationException [Корневое исключение является исключением. Какой должен быть IP-адрес и порт, который я должен использовать, если IP-адрес моего сервера y31 и номер порта 3389. - person Shelly; 18.01.2019
comment
чтобы правильно выполнить jmx, вы должны передать некоторые дополнительные параметры... Возможно, исключение может быть вызвано тем, что вы опускаете -Dcom.sun.management.jmxremote.authenticate=false или какой-либо другой параметр - person Roberto Manfreda; 18.01.2019
comment
Ох, спасибо. Я проверю это. Bdw в config.getServletContext() я не смог найти метод getContextPath(); - person Shelly; 18.01.2019
comment
Обратитесь к этому stackoverflow.com/questions/35837285 / чтобы получить ServletContext в зависимости от ваших потребностей - person Roberto Manfreda; 18.01.2019
comment
Большое спасибо за Вашу помощь. Но все же я не мог придумать решение. - person Shelly; 18.01.2019
comment
Здесь я развертываю свои веб-службы в подкаталоге WEB-INF. Будет ли это проблемой - person Shelly; 18.01.2019
comment
Может быть... Можете ли вы попробовать изменить путь развертывания? - person Roberto Manfreda; 18.01.2019