Статьи

JMX и весна — часть 1

Это первая из трех статей, в которых показано, как расширить возможности приложений Spring с поддержкой JMX.

Конфигурация Maven

Это Maven pom.xml для настройки кода для этого примера:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  <modelVersion>4.0.0</modelVersion>
  <groupId>uk.co.jemos.experiments.jmx</groupId>
  <artifactId>jemos-jmx-experiments</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>jemos-jmx-experiments</name>
  <description>Jemos JMX Experiments</description>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.16</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>3.0.5.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>3.0.5.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jmx</artifactId>
      <version>2.0.8</version>
      <scope>compile</scope>
    </dependency>       
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>3.0.5.RELEASE</version>
        <type>jar</type>
        <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Конфигурация пружины

Конфигурация Spring довольно проста:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>
 
 
    <context:property-placeholder location="classpath:jemos-jmx.properties" />
 
    <bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
        <property name="port" value="${jemos.jmx.rmi.port}" />
    </bean>
 
    <bean id="jemosJmxServer" class="org.springframework.jmx.support.ConnectorServerFactoryBean"
        depends-on="rmiRegistry" >
        <property name="objectName" value="connector:name=rmi" />
        <property name="serviceUrl"
            value="service:jmx:rmi://localhost/jndi/rmi://localhost:${jemos.jmx.rmi.port}/jemosJmxConnector" />
        <property name="environment">
            <!-- the following is only valid when the sun jmx implementation is used -->
            <map>
                <entry key="jmx.remote.x.password.file" value="${user.home}/.secure/jmxremote.password" />
                <entry key="jmx.remote.x.access.file" value="${user.home}/.secure/jmxremote.access" />
            </map>
        </property>
    </bean>
 
</beans>

Эта конфигурация, хотя и простая, охватывает все, что требуется для следующего:

  • Запустите сервер JMX из контекста приложения Spring
  • Предоставить доступ к серверу JMX через удаленный URL RMI
  • Защитите доступ к серверу JMX через аутентификацию и авторизацию

Несколько замечаний по поводу вышеуказанной конфигурации:

  • Вы хотите экспортировать некоторую информацию о конфигурации, такую ​​как порт реестра RMI и хост, на котором работает приложение. Хотя я перенес порт реестра RMI в файл свойств в classpath, я оставил «localhost» в качестве имени хоста. В реальной производственной среде, особенно если вы хотите масштабировать приложение по горизонтали, например, развернуть его на разных серверах, серверная часть удаленного URL-адреса также должна быть выведена на внешний сервер.
  • Поскольку мы предоставляем удаленный URL-адрес RMI, для того, чтобы предоставить JMX-сервер реестру RMI, нам нужно запустить реестр RMI, если он еще не запущен; это происходит путем объявления RmiRegistryFactoryBean. Порт, на котором запущен реестр, должен совпадать с открытым URL-адресом.
  • Приведенная выше конфигурация не включает поддержку MBean на основе аннотаций; такая конфигурация будет предметом моей следующей статьи, в которой я покажу, как кодировать простой MBean для изменения уровня ведения журнала вашего приложения на основе Log4j. Защита доступа к серверу JMX через аутентификацию и авторизацию

В приведенной выше конфигурации вы могли заметить следующую часть:

1
2
3
4
5
6
7
<property name="environment">
            <!-- the following is only valid when the sun jmx implementation is used -->
            <map>
                <entry key="jmx.remote.x.password.file" value="${user.home}/.secure/jmxremote.password" />
                <entry key="jmx.remote.x.access.file" value="${user.home}/.secure/jmxremote.access" />
            </map>
        </property>

Вышеуказанный фрагмент кода объявляет расположение двух файлов, один из которых используется для авторизации, другой — для аутентификации. Я решил поместить такие файлы в ~ / .secure, но в конечном итоге это зависит от вас. Содержание таких файлов простое:

Файл доступа JMX

jemosAdmin readwrite

Приведенный выше файл содержит имя пользователя (jemosAdmin) и его роль (readwrite).

Файл паролей JMX

В файле паролей JMX вы объявляете пользователя и его пароль:

jemosAdmin безопасный

Как только эта информация будет готова, вы можете запустить сервер JMX и затем получить к нему доступ через jconsole или jvisualvm (если вы используете JDK6 или более позднюю версию).

После проверки подлинности коннектор RMI становится доступным как компонент, как и все родные MBean-компоненты Oracle.

В моей следующей статье я покажу, как кодировать простую службу Logging MBean, которую можно использовать во время выполнения для изменения уровня ведения журнала пакета (и всех его подпакетов). Эта услуга дает преимущество увеличения времени безотказной работы и помогает устранять неполадки приложений.

Продолжите к части 2 .

Ссылка: JMX и Spring — часть 1 от нашего партнера по JCG