Давайте сначала предположим пару вещей:
- Я предполагаю, что вы слышали о функциях Java JMX и знакомы с тем, что он делает (предоставляет и управляет вашим сервисом удаленно). Вы должны знать, что JVM по умолчанию будет иметь экземпляр Platform MBeanServer, который вы можете зарегистрировать MBean. И вы можете просмотреть их, используя команду
jconsole
из JDK. - На сегодняшний день, я думаю, что на сегодняшний день самый простой способ предоставления любых служб в приложении для JMX MBeanServer — использование средства экспорта Spring. Вы будете делать что-то вроде этого:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
< bean class = "org.springframework.jmx.export.MBeanExporter" > < property name = "assembler" > < bean class = "org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler" > < property name = "managedInterfaces" > < list > <!-- Expose any java interface you like to see under JMX as MBean --> < value >myproject.services.Service</ value > </ list > </ property > </ bean > </ property > < property name = "beans" > < map > < entry key = "myproject.services:name=MyCoolService" value-ref = "myCoolService" /> </ map > </ property > </ bean > <!-- This service must implements the interface used above --> < bean id = "myCoolService" class = "myproject.services.MyCoolService" > </ bean > |
Выше должно получить автономное приложение с включенным JMX.
Теперь, если вы хотите сделать подобное на сервере WebLogic, у меня есть несколько вкусностей и заметок, которые могут вам помочь. Читать дальше…
MBeanServer сервера WebLogic (WLS)
Прикол JConsole
WLS, как и многие другие серверы EE, будет иметь свой собственный MBeanServer. Однако, чтобы увидеть MBean, вам нужно немного jconsole
с jconsole
. Предположим, у вас есть конфигурация WLS по умолчанию, запущенная на localhost, и вы можете подключиться к ней следующим образом.
1
|
jconsole -J-Djava. class .path= "$JAVA_HOME/lib/jconsole.jar:$MW_HOME/wlserver/server/lib/wljmxclient.jar" -J-Djmx.remote.protocol.provider.pkgs=weblogic.management.remote |
Затем при появлении запроса на вход введите следующее:
1
2
3
|
Remote Process: service:jmx:iiop: //localhost:7001/jndi/weblogic.management.mbeanservers.runtime User: <same userid you used setup WLS to their console app.> Password: <same password you used setup WLS to their console app.> |
Теперь вы должны увидеть все MBean-компоненты, которые WLS уже предоставил вам как EE-сервер. Вы можете добавить свой собственный сервис там.
Программирование с подключением JMX
Вы можете подключиться к WLS MBeanServer удаленно внутри вашего автономного приложения. Вот типичный код подключения, который вам понадобится
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
|
String serviceName = "com.bea:Name=DomainRuntimeService,Type= weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean"; try { ObjectName service = new ObjectName(serviceName); } catch (MalformedObjectNameException e) { throw new RuntimeException( "Not able to create JMX ObjectName: " + serviceName); } String protocol = "t3" ; String jndiroot = "/jndi/" ; String mserver = "weblogic.management.mbeanservers.runtime" ; try { JMXServiceURL serviceURL = new JMXServiceURL(protocol, "localhost" , 7001 , jndiroot + mserver); Hashtable h = new Hashtable(); h.put(Context.SECURITY_PRINCIPAL, username); h.put(Context.SECURITY_CREDENTIALS, password); h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote" ); h.put( "jmx.remote.x.request.waiting.timeout" , new Long( 10000 )); JMXConnector connector = JMXConnectorFactory.connect(serviceURL, h); MBeanServerConnection remoteMBeanServer = connector.getMBeanServerConnection(); // TODO: Do what you need with remoteMBeanServer here. } catch (Exception e) { throw new RuntimeException( "Not able to initiate MBeanServer protocol= " + protocol + ", jndiroot= " + jndiroot + ", mserver= " + mserver); } |
Это полный код котла, чтобы получить удаленное соединение с MBeanServer! К счастью, есть еще один более простой способ. Читать дальше…
Уловка JNDI
Служба WLS MBeanServer также доступна через поиск JNDI. Снова Spring может помочь вам с поиском JNDI, и вам просто нужно внедрить его в другие службы, которые в этом нуждаются. Например:
01
02
03
04
05
06
07
08
09
10
11
|
< bean id = "jmxServerRuntime" class = "org.springframework.jndi.JndiObjectFactoryBean" > < property name = "jndiName" value = "java:comp/env/jmx/runtime" /> </ bean > < bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter" > < property name = "beans" > < map > < entry key = "myproject.services:name=MyCoolService" value-ref = "myCoolService" /> </ map > </ property > < property name = "server" ref = "jmxServerRuntime" /> </ bean > |
Обратите внимание, что мы добавили свойство «server» в свойство «WLS JNDI». Если вы используете это в своем WAR-приложении и развертываете его на экземпляре WLS, и все, вы получаете доступ к сервису на WLS JMX!
Запись
Вышеуказанное будет работать только в том случае, если ваша конфигурация Spring xml является частью WAR / JAR / EAR, развернутого на том же сервере, где живет JNDI! Если нет, вам нужно использовать это имя JNDI без части «env», например «java: comp / env / jmx / runtime».
Для получения дополнительной информации о том, как работать с JMX и WLS, см. Их документы здесь: http://docs.oracle.com/cd/E12839_01/web.1111/e13728/accesswls.htm#i1119556