2012-05-18 2 views
1

Я узнал много нового о JMX за последние пару лет и создал несколько привлекательных MBeans для своих веб-приложений. Тем не менее, я не уверен, что у меня есть хороший ответ на довольно простой вопрос:Мониторинг Java: JMX против сервлетов

Зачем использовать JMX поверх простых HTTP-сервлетов?

Мои текущие веб-приложения предлагают избыточные возможности мониторинга: я могу получить доступ к данным, которые необходимо контролировать через JMX с клиентом, например JConsole, или я могу получить доступ к тем же данным в формате XML через сервлет. Я не вижу сильной причины использовать один метод над другим, но метод сервлета имеет основное преимущество в том, что он читается простым http-клиентом/веб-браузером.

Я вижу, как JMX будет очень полезен для приложений Java, которые не являются веб-приложениями, но я не вижу никакого преимущества в использовании JMX для веб-приложения.

ответ

7

Зачем использовать JMX через простые HTTP-сервлеты?

С моей точки зрения, JMX лучше по 3 причинам:

  1. Это требует меньше коды для включения точек мониторинга.
  2. Он связан с Java-сериализованными объектами от конца до конца, поэтому существует более четкая согласованность данных.
  3. Он работает с программами, которые не основаны на сервлете (как вы упомянули).

JMX предлагает гораздо более простой интерфейс для конкретных элементов данных. Вы можете, конечно, написать одну и ту же функциональность в нескольких сервлетах, но мне легче разоблачить тех, кто использует JMX.

Например, если вы используете Spring, вы можете использовать аннотации org.springframework.jmx.export (@ManagedResource, и т. Д.), Чтобы разметить классы. Я также опубликовал свой SimpleJmx framework, чтобы вы могли легко выставлять атрибуты и операции с помощью нескольких аннотаций, независимых от Spring. Например:

@JmxResource(domainName = "j256", objectName = "lookupCache") 
public class LookupCache { 

    // this can also be done as @JmxAttributeMethod on the getter/setters 
    @JmxAttributeField(description = "Number of hits in the cache") 
    private int hitCount; 
    ... 

    @JmxOperation(description = "Flush the cache") 
    public void flushCache() { 
     ... 
    } 
} 

У меня есть fully working example program, чтобы увидеть, как это работает. Поэтому все, что вам нужно сделать, чтобы показать значение или операцию, - добавить аннотацию к классу и каждому атрибуту и ​​/ или методу. Код для публикации с помощью SimpleJmx выглядит следующим образом. Spring похож, хотя и с фасолью:

// create a new server listening on port 8000 
JmxServer jmxServer = new JmxServer(8000); 
jmxServer.start(); 
// register our lookupCache object defined above 
jmxServer.register(lookupCache); 

Чтобы получить подобную функциональность сервлетов бы намного больше кода, чем просто аннотации. Тем не менее, могут существовать рамки, которые обеспечивают аналогичную функциональность в сервлете, о которой я не знаю.

еще несколько заметок:

  • Есть, вероятно, более эффективные инструменты мониторинга, ГРКИ HTTP/HTML, но есть также тонна распределенных приложений мониторинга JMX. Наверное, подбросить.
  • Возможность программно получать объектов с серверов JMX является плюсом, а не просто строками с страницы сервлета. SimpleJmx также поддерживает простой клиент JMX, хотя там есть лучшие.
  • Очевидно много других стоящих данных уже опубликован JVM по умолчанию: настройки виртуальной машины, детали резьбы, память информация, и т.д ..
0

В дополнение к чтению значений JMX может использоваться для вызова методов управления компонентами.

Например, мы часто используем его для принудительной сборки мусора JVM для экземпляров Tomcat удаленно.

Также из-за того, что JMX - это другой порт, на котором http/https вы можете ограничить доступ на сетевом уровне через брандмауэры. JMX имеет встроенную аутентификацию имени пользователя и пароля.

Веб-сервлет должен будет реализовать свой собственный контроль доступа.

1

На моем взгляде JMX переоценен, и это может быть сложно настроить , Если ваше приложение уже является webcontainer, я думаю, вам обязательно нужно пойти на простой сервлет.

Крошечный подход к сервлету, такой как https://github.com/lorenzoongithub/nudge4j даст вам все и многое другое.

Смежные вопросы