Давайте сначала предположим пару вещей:
- Я предполагаю, что вы слышали о функциях 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.runtimeUser: <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