내용 목차
JEUS 모니터링 서비스를 사용하기 위한 JEUS JMX 클라이언트 애플리케이션의 개발 및 설치 방법에 대해서 설명한다.
JEUS JMX를 사용하는 3가지 방법은 다음과 같다.
그 외에, JEUS 모니터링 서비스를 위한 보안 설정 방법과 JEUS JMX에서 ObjectName을 생성하는 규칙에 대해서 설명한다. SNMP를 사용해서 JEUS 모니터링이 가능한데, 사용 방법은 "JEUS SNMP 안내서"에서 확인할 수 있다. 본 장에서 설명하는 예제는 다음의 디렉터리를 참고한다.
JEUS_HOME\samples\jmx\clientsetup
본문에서 설명하는 내용을 이해하기 위해서 JMX Remote API 1.0과 Java EE Management 스펙에 대한 기본 지식이 있어야 한다. JMX Remote API에 대한 자세한 정보는 SUN에서 제공하는 J2EE JMX Remote API 1.0 스펙과 JMX Remote API를 참고한다.
애플리케이션의 구조는 필요에 따라 다양한 형태가 있다. JEUS JMX 클라이언트 애플리케이션은 일반적인 구조로 구성되어 있고, 구성된 그 구조를 따라 수행한다.
다음은 JMX 클라이언트 애플리케이션의 수행 구조 및 과정이다.
환경설정(옵션 사항)
JMX 클라이언트 애플리케이션을 위해 환경을 설정한다. 환경설정을 MBeanServer에 연결하기 전에 할 수 있다. 처리하려는 MBean을 질의하고, 그 결과를 받아서 처리할 수 있다.
MBeanServer 연결
MBeanServer로 접속하기 위한 방법은 앞서 말한 3가지 방법이 있다. jeus.management.RemoteMBeanServerFactory는 JEUS 유틸리티를 사용하는 경우 사용되고, 이 외에 JNDI에 등록되어 있는 reference를 사용하거나 JMX Remote javax.management.remote.JMXServiceURL을 사용하여 javax.management.remote.JMXConnector를 얻을 수 있다. 자세한 내용은 다음 장에서 설명한다.
질의
질의 결과 처리
본 절에서는 JEUS 유틸리티클래스인 jeus.management.RemoteMBeanServerFactory를 사용해서 JEUS를 모니터링하는 JMX 애플리케이션에 대해서 설명한다. "MBeanServer 연결" 부분이 다른 방법과 차이가 있다.
다음은 JEUS 유틸리티를 사용하는 클라이언트 예제이다.
package jmxclient; import java.util.Set; import java.util.Iterator; import java.util.Hashtable; import javax.management.ObjectName; import javax.management.MBeanServerConnection; import javax.naming.Context; /** * JMX Client which uses JEUS utility (RemoteMBeanServerFactory) class. */ public class JMXClientUsingJeusUtility { public static void main(String args[]) throws Exception { if(args.length < 3) { System.out.println("Required arguments: hostname username password"); return; } // Step 1. Setting Environments String hostname = args[0]; String username = args[1]; String password = args[2]; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "jeus.jndi.JNSContextFactory"); env.put(Context.PROVIDER_URL, hostname); env.put(Context.SECURITY_PRINCIPAL, username); env.put(Context.SECURITY_CREDENTIALS, password); // Step 2. Getting MBeanServer MBeanServerConnection mbeanServer = jeus.management.RemoteMBeanServerFactory.getMBeanServer(env); // Step 3. Query ObjectName jeusScope = new ObjectName("JEUS:*"); Set objectNames = mbeanServer.queryNames(jeusScope, null); // Step 4. Handling the Query Result for(Iterator i = objectNames.iterator(); i.hasNext();) { System.out.println("[MBean] " + i.next()); } } }
"MBeanServer 연결"에서 JEUS가 제공하는 JEUS 유틸리티 클래스인 jeus.management.RemoteMBeanServerFactory를 사용했다. 이 클래스를 사용하면 간단하게 MBeanServerConnection을 얻을 수 있다.
본 절에서는 JNDI를 사용해서 JEUS를 모니터링하는 JMX 애플리케이션에 대해서 설명한다. "MBeanServer 연결" 부분이 다른 방법과 차이가 있다.
다음은 JNDI를 사용하는 클라이언트 예제이다.
package jmxclient; import java.util.Set; import java.util.Iterator; import java.util.Hashtable; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.naming.Context; import javax.naming.InitialContext; /** * JMX Client which uses JNDI lookup. */ public class JMXClientUsingJndi { public static void main(String args[]) throws Exception { if(args.length < 4) { System.out.println("Required arguments: " + "hostname username password target-name"); return; } // Step 1. Setting Environments String hostname = args[0]; String username = args[1]; String password = args[2]; // targetName could be node or container name, // for example, "johan", "johan_container1" String targetName = args[3]; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY,"jeus.jndi.JNSContextFactory"); env.put(Context.PROVIDER_URL, hostname); env.put(Context.SECURITY_PRINCIPAL, username); env.put(Context.SECURITY_CREDENTIALS, password); // Step 2. Getting MBeanServerConnection InitialContext ctx = new InitialContext(env); JMXConnector connector = null; try{ connector = (JMXConnector)ctx.lookup("mgmt/rmbs/" + targetName); MBeanServerConnection mbeanServer = connector.getMBeanServerConnection(); // Step 3. Query ObjectName jeusScope = new ObjectName("JEUS:*"); Set objectNames = mbeanServer.queryNames(jeusScope, null); // Step 4. Handling the Query Result for(Iterator i = objectNames.iterator(); i.hasNext();) { System.out.println("[MBean] " + i.next()); } } finally { // Always close the JMXConnector connector.close(); } } }
JNDI에서 Lookup할 때에는 등록되어 있는 Connector(RMI Connector/JMXMP Connector)의 종류에 관계없이 같은 방식으로 사용이 가능하다. Lookup할 때 사용하는 Export Name은 여기서는 JEUS에서 사용하는 기본 naming 방식을 사용했다. 이 방식은 JNDI context mgmt/rmbs/ 아래에 Manager JVM이나 default Engine Container JVM의 MBeanServer는 <node_name> (예: johan), 그 외 별도로 띄워진 Engine Container의 경우는 <node_name>_<container_name> (예: johan_container1)의 이름이다.
그 외에 RMI Connector의 경우에는 JMXMP Connector가 별도로 띄워져 있는 경우에 기본 방식 이외의 이름을 reference export name으로 지정할 수 있다.
1. RMI Connector 설정의 자세한 내용은 "JEUS XML Reference"를 참고한다.
2. JNDI의 자세한 정보에 대해서는 "JEUS Server 안내서"를 참고한다. 만약에 JMX 애플리케이션이 서블릿 또는 EJB에서 실행된다면 JNDI 파라미터에 대한 설정은 필요하지 않다.
3. Security 설정에 대한 자세한 설명은 “3.6. Security 설정”을 참고한다.
본 절에서는 JMX Remote API를 사용해서 JEUS를 모니터링하는 JMX 애플리케이션에 대해서 설명한다. "MBeanServer 연결" 부분이 다른 방법과 차이가 있다.
다음은 JMX Remote API를 사용하는 클라이언트 예제이다.
package jmxclient; import java.util.Set; import java.util.Iterator; import java.util.Hashtable; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXServiceURL; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.naming.Context; /** * JMX Client which uses JMX Service URL. * RMI Connector should be turned on in JEUS * and the JNDI name of it is required here. */ public class JMXClientUsingJmxUrl { public static void main(String args[]) throws Exception { if(args.length < 4) { System.out.println("Required arguments: " + "hostname username password connector-exportname"); return; } // Step 1. Setting Environments String hostname = args[0]; String username = args[1]; String password = args[2]; // the JMX RMIConnector export name specified in the JEUSMain.xml String exportName = args[3]; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "jeus.jndi.JNSContextFactory"); env.put(Context.PROVIDER_URL, hostname); env.put(Context.SECURITY_PRINCIPAL, username); env.put(Context.SECURITY_CREDENTIALS, password); // Step 2. Getting MBeanServer JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/" + exportName); JMXConnector connector = null; try { connector = JMXConnectorFactory.newJMXConnector(url,env); // connect to JMXConnectorServer connector.connect(); MBeanServerConnection mbeanServer = connector.getMBeanServerConnection(); // Step 3. Query ObjectName jeusScope = new ObjectName("JEUS:*"); Set objectNames = mbeanServer.queryNames(jeusScope, null); // Step 4. Handling the Query Result for(Iterator i = objectNames.iterator(); i.hasNext();) { System.out.println("[MBean] " + i.next()); } } finally { // Always close the JMXConnector connector.close(); } } }
이 경우는 RMI Connector를 사용할 때에 한정된다. 위의 exportName 변수에 지정되는 URL path는 RMI Connector 설정에서 <export-name> 설정으로 바꿀 수 있다. RMI Connector 설정의 자세한 내용은 "JEUS XML Reference"를 참고한다.
다음은 RMIConnector를 JEUSMain.xml에 지정한 예이다.
[예 3.1] RMIConnector 설정 : <<JEUSMain.xml>>
<jmx-manager> <jmx-connector> <rmi-connector> <export-name>RMIConnector</export-name> </rmi-connector> </jmx-connector> </jmx-manager>
본 절에서는 JEUS 모니터링 서비스를 위한 보안 설정에 대해서 설명한다. 기본적으로 Security 파일인 accounts.xml과 policies.xml에서 사용자에게 권한을 줄 수 있고, 권한을 가진 사용자들만이 JMX 클라이언트 애플리케이션에 접근할 수 있다.
다음은 accounts.xml의 예제이다.
[예 3.2] Security 설정 : <<accounts.xml>>
. . . <accounts> <users> <user> <name>jeus</name> <password>{base64}MTExMTExMQ==</password> <group>Administrators</group> </user> </users> <groups> <group> <description>A group for administrators</description> <name>Administrators</name> </group> </groups> </accounts> . . .
다음은 policies.xml의 예제이다.
[예 3.3] Security 설정 : <<policies.xml>>
. . . <policy> <role-permissions> <role-permission> <principal>jeus</principal> <role>SecurityAdministrator</role> <classname>jeus.security.resource.RolePermission </classname> </role-permission> </role-permissions> <resource-permissions> <context-id>default</context-id> <resource-permission> <role> SecurityAdministrator </role> <resource>jeus.*</resource> <actions>*</actions> <classname>jeus.security.resource.Resource Permission </classname> </resource-permission> </resource-permissions> </policy> . . .
다음은 사용자명(username), 패스워드를 지정하는 방식에 대한 예제이다.
// Step 1. Setting Environments Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "jeus.jndi.JEUSContextFactory"); env.put(Context.PROVIDER_URL, hostname); env.put(Context.SECURITY_PRINCIPAL, username); env.put(Context.SECURITY_CREDENTIALS, password);
이상으로 JMX 애플리케이션의 보안 설정에 대해서 알아보았다. 다음 절에서는 JEUS MBean의 표준 JMX Object Name구조에 대해서 알아본다.
ObjectName은 MBean 객체의 기본 JMX 객체 이름이다. ObjectName의 형식은 JMX 표준 형식이지만 JMX 구현이 각각 다르기 때문에 특정 벤더에 따라 값이 달라질 수 있다. JMX MBean들의 계층 구조는 벤더마다 다르고, MBean들도 벤더에 따라 여러 가지가 있다.
JEUS ObjectName의 문법은 다음과 같다.
<domain_name>: j2eeType=<j2eeType_value>, name=<name_value>, [<parent-j2eeType_value>], [jeusType = <jeusType_value>], [isTargetable = <isTargetable_value>], [jeusManager = <jeusManager_value>], JMXManager = <JMXManager_value> [,*]
또는
<domain_name>: *
ObjectName은 “domain_name”으로 시작해야 하고, 각각의 이름과 값의 짝이 순차적으로 규정되지 않는다. 예를 들면 “JEUS: j2eeType=JeusService, jeusType=JEUSManager, *” 과 “JEUS: jeusType=JeusManager, j2eeType=JeusService, *” 는 둘 다 JEUSManager MBean의 objectname을 얻어온다.
다음은 각 항목에 대한 설명이다.
<domain_name>
JEUS 도메인 이름으로 값은 JEUS이다.
j2eeType
MBean은 J2EE Type이며, J2EE Management 스펙에 의해 기술된다.
다음 값들 중 하나를 설정한다.
JeusService | J2EEDomain | J2EEServer |
JVM | EJBModule | MessageDrivenBean |
EntityBean | StatefulSessionBean | StatelessSessionBean |
WebModule | AppClientModule | Servlet |
JDBCResource | JDBCDataSource | JDBCDriver |
JMSResource | JTAResource | JMSConnectionResource |
JMSConsumerResource | JMSProducerResource | JAXRResource |
ResourceAdapter | URLResource | JavaMailResource |
name
MBean 의 이름으로 각각의 MBean Object에는 유일한 값이 있다.
예를 들면 “johan_container1”이라는 컨테이너가 실행하는 JVM의 이름은 “johan_container1”이다.
parent-j2eeType
MBean의 상위 j2ee 타입으로 각 MBean들에 계층이 규정되어 있다.
예를 들면 “JDBCDriver”의 상위 j2ee 타입은 “JDBCDataSource”이다.
jeusType
JEUS JMX에서 정의된 MBean들의 타입이다. “JeusService” j2eeType만 몇 가지 jeusType을 가질 수 있다.
다음 값들 중 하나를 설정한다.
JeusManager | JMSConnectionResource | JMSConsumerResource |
JMSProducerResource | JMSSessionResource | EJBEngine |
ContextGroup | DBConnectionPool | ThreadPool_WEBC |
ThreadPool | WebEngine | WebListener |
JMSClientResource | JMSQueueConnectionFactoryResource | JMSTopicConnectionFactoryResource |
JMSQueueDestinationResource | JMSTopicDestinationResource | JMSDurableSubscriberResource |
JDBCConnectionInfo | Policy | Subject |
Security | SessionContainerCentral | SessionContainerP2P |
SessionContainer | WebtConnectionGroup | WSEngine |
RemoteWebtob |
isTargetable
사용자 AP(EJB, 서블릿, JSP)가 디플로이되어 isTargetable 동작하는 MBean에서는 반드시 true로 설정되어야 한다. 값은 true 또는 false이다.