Конфигурация 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
|
< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > < 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" ?> xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> < 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